如何在Pandas中按多列分组并对不同列执行聚合操作?
解决Pandas DataFrame分组聚合的问题
我来帮你搞定这个和SQL对应的分组聚合需求~你想要的是按Letter和From分组后,对Price求和、对RT取最大值,这和你写的SQL逻辑完全对应,但之前用的sum(['RT','To'])是对指定列做求和操作,既没处理Price,也不是你需要的RT取最大值,所以才没得到预期结果。
正确实现方法
最直接的方式是用Pandas的agg()方法,它支持对不同列指定不同的聚合函数,完美匹配你的SQL需求:
方式1:自定义聚合列名(推荐)
这种方式可以给聚合后的列起更清晰的名字,和SQL里的别名类似:
import pandas as pd # 假设你的df已经创建好 result = df.groupby(['Letter', 'From']).agg( Total_Price=('Price', 'sum'), # 对Price列求和,结果列名为Total_Price Max_RT=('RT', 'max') # 对RT列取最大值,结果列名为Max_RT ).reset_index()
reset_index()的作用是把Letter和From这两个分组列从索引变回普通数据列,方便后续操作。
方式2:保留原列名
如果你不需要重命名列,也可以用字典格式指定聚合规则:
result = df.groupby(['Letter', 'From']).agg({ 'Price': 'sum', 'RT': 'max' }).reset_index()
这种方式得到的结果列名还是Price和RT,值分别是聚合后的求和与最大值。
示例结果
用你提供的测试DataFrame运行上面的代码后,会得到这样的结果:
| Letter | From | Total_Price | Max_RT |
|---|---|---|---|
| A | 2020-06-04 | 29 | 11 |
| A | 2020-06-05 | 56 | 11 |
| B | 2020-06-04 | 12 | 11 |
| B | 2020-06-05 | 89 | 11 |
| B | 2020-06-06 | 1 | 11 |
这个结果和你写的SQL查询返回的内容完全一致~
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

