gpt4 book ai didi

python - Pandas:条件组特定计算

转载 作者:太空狗 更新时间:2023-10-30 01:08:14 25 4
gpt4 key购买 nike

假设我有一个表,其中包含一个键(例如客户 ID)和两个数字列 C1 和 C2。我想按键(客户)对行进行分组,并在其列上运行一些聚合器,如 sum 和 mean 。在计算组聚合器之后,我想将结果分配回 DataFrame 中的每个客户行(因为一些客户范围的功能添加到每一行)。

我可以看到我可以做类似的事情
df['F1'] = df.groupby(['Key'])['C1'].transform(np.sum)
如果我只想聚合一列并能够将结果添加回 DataFrame。

我能否使其成为有条件的 - 我能否仅将 C2 列等于某个数字 X 的行添加到组中的 C1 列,并且仍然能够将结果添加回 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

如果您想执行有条件的 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=['']))

关于python - Pandas:条件组特定计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24250832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com