如何在Pandas DataFrame分组时为不同列应用不同聚合函数?
解决Pandas分组后多列不同聚合规则的问题
原始数据
| booking_order | driver_name | tonnage | stop_name | parcels | kgs |
|---|---|---|---|---|---|
| 2794 | John | 3 | Warsaw | 200 | 180 |
| 2794 | John | 3 | Radom | 300 | 270 |
| 2794 | John | 3 | Krakow | 150 | 135 |
| 3005 | Mark | 5 | Gdansk | 500 | 450 |
| 3005 | Frank | 5 | Gdynia | 400 | 360 |
| 3005 | Frank | 5 | Sopot | 123 | 10.7 |
任务要求
按booking_order分组后,各列处理规则:
driver_name:取唯一值,用逗号+空格拼接tonnage:取唯一值(同分组内该值一致,直接提取即可)stop_name:取唯一值,用>拼接parcels:求和kgs:求和
正确代码
import pandas as pd # 读取源数据 excel = pd.read_excel('source.xlsx') # 定义各列对应的聚合规则 agg_rules = { 'driver_name': lambda x: ', '.join(pd.unique(x)), 'tonnage': lambda x: pd.unique(x)[0], 'stop_name': lambda x: '>'.join(pd.unique(x)), 'parcels': 'sum', 'kgs': 'sum' } # 执行分组聚合,保留分组列为普通列 result = excel.groupby('booking_order', as_index=False).agg(agg_rules) # 保存结果到Excel,不写入索引列 result.to_excel('result1.xlsx', index=False)
代码说明
聚合规则字典:核心是通过
agg_rules字典为每列指定专属处理逻辑,替代原代码中统一转列表的操作:driver_name:用pd.unique(x)提取唯一值,再通过,.join拼接成字符串tonnage:同分组内该列值唯一,直接取去重后的第一个元素即可stop_name:提取唯一值后用>拼接parcels和kgs:直接使用Pandas内置的sum函数完成求和
分组参数优化:
groupby设置as_index=False,避免分组列转为索引,无需额外调用reset_index结果保存:
to_excel时设置index=False,避免把索引列写入Excel文件
运行后得到的结果与预期完全一致:
| booking_order | driver_name | tonnage | stop_name | parcels | kgs |
|---|---|---|---|---|---|
| 2794 | John | 3 | Warsaw>Radom>Krakow | 650 | 585.0 |
| 3005 | Mark, Frank | 5 | Gdansk>Gdynia>Sopot | 1023 | 920.7 |
内容的提问来源于stack exchange,提问作者bluekit46
相关产品推荐
相关产品推荐

