You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame分组时为不同列应用不同聚合函数?

解决Pandas分组后多列不同聚合规则的问题

原始数据

booking_orderdriver_nametonnagestop_nameparcelskgs
2794John3Warsaw200180
2794John3Radom300270
2794John3Krakow150135
3005Mark5Gdansk500450
3005Frank5Gdynia400360
3005Frank5Sopot12310.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)

代码说明

  1. 聚合规则字典:核心是通过agg_rules字典为每列指定专属处理逻辑,替代原代码中统一转列表的操作:

    • driver_name:用pd.unique(x)提取唯一值,再通过, .join拼接成字符串
    • tonnage:同分组内该列值唯一,直接取去重后的第一个元素即可
    • stop_name:提取唯一值后用>拼接
    • parcels和kgs:直接使用Pandas内置的sum函数完成求和
  2. 分组参数优化:groupby设置as_index=False,避免分组列转为索引,无需额外调用reset_index

  3. 结果保存:to_excel时设置index=False,避免把索引列写入Excel文件

运行后得到的结果与预期完全一致:

booking_orderdriver_nametonnagestop_nameparcelskgs
2794John3Warsaw>Radom>Krakow650585.0
3005Mark, Frank5Gdansk>Gdynia>Sopot1023920.7

内容的提问来源于stack exchange,提问作者bluekit46

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:35:41