假设我有一个带密钥的表(例如客户ID)和两个数字列C1和C2.我想按键(客户)对行进行分组,并在其列上运行一些聚合器,如sum和mean.在计算组聚合器之后,我想将结果分配回DataFrame中的每个客户行(因为某些客户范围的功能已添加到每一行).
我可以看到,我可以做一些事情,
df['F1'] = df.groupby(['Key'])['C1'].transform(np.sum)
如果我想只聚合一列,并能够将结果添加回DataFrame.
我可以使它成为条件 - 我可以在一个组中添加C1列,仅用于C2列等于某个数字X的行,并且仍然能够将结果添加回DataFrame吗?
如何在以下行的组合上运行聚合器:
np.sum(C1 + C2)?
实现它的最简单,最优雅的方法是什么?最有效的方法是什么?这些聚合可以在一条路径上完成吗?
先感谢您.
这是一些虚拟数据的设置.
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
Run Code Online (Sandbox Code Playgroud)
如果要执行条件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
Run Code Online (Sandbox Code Playgroud)
这是因为transform
操作保留了索引,因此它仍将正确地与原始数据帧对齐.
如果你想将两个列的组总和相加,可能最容易做到这样的事情?有人可能会有更聪明的东西.
In [93]: gb = df.groupby('Key')
In [94]: df['C1+C2'] = gb['C1'].transform(np.sum) + gb['C2'].transform(np.sum)
Run Code Online (Sandbox Code Playgroud)
编辑:这是获得多列的组总计的另一种方法.语法实际上并不是更清晰,但对于大量的列可能更方便.
df['C1_C2'] = gb[['C1','C2']].apply(lambda x: pd.DataFrame(x.sum().sum(), index=x.index, columns=['']))
Run Code Online (Sandbox Code Playgroud)