熊猫有效地将groupby函数应用于每一列[重复]

Posted

技术标签:

【中文标题】熊猫有效地将groupby函数应用于每一列[重复]【英文标题】:Pandas Apply groupby function to every column efficiently [duplicate] 【发布时间】:2017-01-20 07:32:41 【问题描述】:

pandas 中,您可以将一些 groupby 函数应用于数据框中的每一列,例如:

pt=df.groupby(['Group']).sum().reset_index()

假设我想应用一个 lambda 函数 lambda x: (0 < x).sum() 来计算其中包含值的单元格,然后计算每个组中的总项目数。除了重复此代码之外,是否有更有效的方法将此应用于所有列:

import pandas as pd

df=pd.DataFrame('Group':['W', 'W', 'W', 'E','E','E','N'],
'A':[0,1,5,0,1,5,7],
'B':[1,0,5,0,0,2,0],
'C':[1,1,5,0,0,5,0],
'Total':[2,2,15,0,1,12,7]
)

#Check how many items are present in Group
grp=df.groupby(['Group'])
pt1 = grp['A'].apply(lambda x: (0 < x).sum()).reset_index()
pt2 = grp['B'].apply(lambda x: (0 < x).sum()).reset_index()
pt3 = grp['C'].apply(lambda x: (0 < x).sum()).reset_index()

pct=pd.merge(pt1, pt2, on=['Group'])
pct=pd.merge(pt2, pct, on=['Group'])

#Get total items and merge with counts
pt = df.groupby(['Group'])['Total'].count().reset_index()
pct=pd.merge(pt, pct, on=['Group'])

输出:

  Group  Total  C  A  B
0     E      3  1  2  1
1     N      1  0  1  0
2     W      3  3  2  2

为 n 列编写它的有效方法是什么?

【问题讨论】:

我不确定我是否理解正确。我无法执行最后一部分,因为我不知道“总计”列代表什么,但grp[['A', 'B', 'C']].apply(lambda x: (0 &lt; x).sum()) 将相同的函数应用于所有三列。这是你要问的吗? @ayhan 有点像,但对于整个数据框,不仅仅是 A、B、C 有办法。我试过pct=df.groupby(['Group']).apply(lambda x: (0 &lt; x).sum()).reset_index() 但它不起作用 可能有。但是您需要提供一个示例数据框和您的预期输出。当你说它不起作用时,我不知道出了什么问题,所以如果你举一个预期输出的例子,帮助你会更容易。 @ayhan 好的,我将提供一个示例数据框 【参考方案1】:

我能想到的最简洁的方法是:

(df > 0).groupby(df['Group']).agg('A': 'sum', 'B': 'sum', 'C': 'sum', 'Total': 'count')
Out: 
         C  Total    B    A
Group                      
E      1.0      3  1.0  2.0
N      0.0      1  0.0  1.0
W      3.0      3  2.0  2.0

如果需要,您可以排序并转换为 int:

((df > 0).groupby(df['Group']).agg('A': 'sum', 'B': 'sum', 'C': 'sum', 'Total': 'count')
                              .sort_index(axis=1).astype('int')
Out: 
       A  B  C  Total
Group                
E      2  1  1      3
N      1  0  0      1
W      2  2  3      3

【讨论】:

我必须定义每个列名还是有办法应用到整个数据框? (例如,如果我这样做 pt=df.groupby(['Group']).sum().reset_index() )我可以在不定义列名的情况下获得结果。 由于您将不同的功能应用于不同的列,我认为这是不可能的(除了我在评论中建议的方式)。

以上是关于熊猫有效地将groupby函数应用于每一列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将函数应用于熊猫中数据框的每一列

熊猫数据框:groupby 和 plot 有两个不同的列

将大熊猫数据帧的每一列与同一数据帧的每一列相乘的最有效方法

如何将*多个*功能应用于熊猫 groupby 应用?

如何有效地将稀疏矩阵列添加到另一个稀疏矩阵中的每一列?

在 groupby 熊猫对象上应用 rolling() 时,多索引重复