【发布时间】: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 < x).sum())将相同的函数应用于所有三列。这是你要问的吗? -
@ayhan 有点像,但对于整个数据框,不仅仅是 A、B、C 有办法。我试过
pct=df.groupby(['Group']).apply(lambda x: (0 < x).sum()).reset_index()但它不起作用 -
可能有。但是您需要提供一个示例数据框和您的预期输出。当你说它不起作用时,我不知道出了什么问题,所以如果你举一个预期输出的例子,帮助你会更容易。
-
@ayhan 好的,我将提供一个示例数据框