pandas dataframe:如何根据列的值聚合行的子集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas dataframe:如何根据列的值聚合行的子集相关的知识,希望对你有一定的参考价值。

我有一个像这样的pandas数据框:

      value
lab        
A        50
B        35
C         8
D         5
E         1
F         1

这只是一个例子,实际的数据帧更大,但遵循相同的结构。 已使用以下两行创建了示例数据框:

df = pd.DataFrame('lab':['A', 'B', 'C', 'D', 'E', 'F'], 'value':[50, 35, 8, 5, 1, 1])
df = df.set_index('lab')

我想聚合其值小于给定阈值的行:所有这些行应该由单行代替,其值是替换行的总和。

例如,如果我选择阈值= 6,则预期结果应如下所示:

      value
lab        
A        50
B        35
C         8
X         7 #sum of D, E, F

我怎样才能做到这一点?

我想使用groupby(),但我见过的所有例子都涉及使用单独的列进行分组,所以在这种情况下我不知道如何使用它。 我可以通过loc选择小于我的阈值的行,通过执行df.loc[df['value'] < threshold]但我不知道如何只对这些行求和并使数据帧的其余部分保持不变。

答案

使用setting with enlargement和过滤的DataFrame

threshold = 6
m = df['value'] < threshold
df1 = df[~m].copy()
df1.loc['Z'] = df.loc[m, 'value'].sum()

print (df1)
     value
lab       
A       50
B       35
C        8
Z        7

另一种方案:

m = df['value'] < threshold
df1 = df[~m].append(df.loc[m, ['value']].sum().rename('Z'))
print (df1)
     value
lab       
A       50
B       35
C        8
Z        7
另一答案

你可以使用lambdaDataFrame.append来实现这个'单线':

thresh = 6

(df[lambda x: x['value'] >= thresh]
 .append(df[lambda x: x['value'] < thresh].sum().rename('X')))

或者如果你愿意的话

mask = df['value'].ge(thresh)

df[mask].append(df[~mask].sum().rename('X'))

[OUT]

     value
lab       
A       50
B       35
C        8
X        7

以上是关于pandas dataframe:如何根据列的值聚合行的子集的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用replace函数替换dataframe中的值:replace函数对dataframe中指定数据列的值进行替换替换具体数据列的相关值

用 Pandas 将 DataFrame 中某些列和行的值替换为同一 DataFrame 中另一列的值

如何根据火花DataFrame中另一列的值更改列的值

Python-Pandas。根据列表中列的存在重新分配列的值

pandas筛选dataframe数据:指定一个数据列的值不等于某个固定值,而且另外一个数据列的值大于某一阈值

Pandas: Grouped DataFrame - 将列的值除以每个组该列中某一行的值