这是一些虚拟数据的一些设置。
In [81]: df = pd.DataFrame({'Key': ['a','a','b','b','c','c'],
'C1': [1,2,3,4,5,6],
'C2': [7,8,9,10,11,12]})
In [82]: df['F1'] = df.groupby('Key')['C1'].transform(np.sum)
In [83]: df
Out[83]:
C1 C2 Key F1
0 1 7 a 3
1 2 8 a 3
2 3 9 b 7
3 4 10 b 7
4 5 11 c 11
5 6 12 c 11
如果你想做一个条件GroupBy,你可以在数据帧传递到时过滤它.groubpy
。例如,如果您希望在 C2 小于 8 或大于 9 时求“C1”的组总和。
In [87]: cond = (df['C2'] < 8) | (df['C2'] > 9)
In [88]: df['F2'] = df[cond].groupby('Key')['C1'].transform(np.sum)
In [89]: df
Out[89]:
C1 C2 Key F1 F2
0 1 7 a 3 1
1 2 8 a 3 NaN
2 3 9 b 7 NaN
3 4 10 b 7 4
4 5 11 c 11 11
5 6 12 c 11 11
这是有效的,因为transform
操作保留索引,因此它仍然会与原始数据帧正确对齐。
如果您想对两列的组总数求和,可能最容易做这样的事情?有人可能有更聪明的东西。
In [93]: gb = df.groupby('Key')
In [94]: df['C1+C2'] = gb['C1'].transform(np.sum) + gb['C2'].transform(np.sum)
编辑:
这是获取多列的组总计的另一种方法。该语法实际上并不是更清晰,但对于大量列可能更方便。
df['C1_C2'] = gb[['C1','C2']].apply(lambda x: pd.DataFrame(x.sum().sum(), index=x.index, columns=['']))