pandas链式调用groupby.agg(sum)后再groupby.mean()结果异常咨询
Pandas 聚合结果不符合预期的问题解决
错误原因
你的现有写法存在两处逻辑错误,导致第一次聚合操作未生效:
- 第一次
groupby(['Rider','Hours','T1 Delivered']).agg(sum)执行后,只有作为分组键的Rider、Hours、T1 Delivered会成为结果的索引,其余数值列会被全部求和,非数值列会直接丢弃。你第二次分组用到的Minutes PD、Delivery Success如果不是第一次的分组键,要么已经被求和修改为非原始值,要么直接被丢弃,第二次分组的基础数据本身就不符合预期。 - 链式两次
groupby的逻辑和你的需求不匹配:你需要同时完成指定列求和、另外两列按日期维度求均值的操作,不需要拆分两次groupby,pandas的agg()方法本身支持对不同列指定不同的聚合规则。
正确实现方案
根据你的需求,推荐直接在单次groupby中通过agg指定多套聚合规则即可,示例如下(请将示例中的占位字段替换为你实际的表字段):
# 1. 先定义聚合规则:分别指定不同列的聚合方式 agg_rules = { # 此处填写所有需要求和的列,聚合规则设为sum "订单量": "sum", "配送里程": "sum", # 两个需要求均值的列,聚合规则设为mean "Minutes PD": "mean", "Delivery Success": "mean" } # 2. 把所有需要用到的分组维度(包括你的日期维度列、Rider、Hours、T1 Delivered)放入groupby列表 per_courier = df.groupby(["日期列", "Rider", "Hours", "T1 Delivered"]).agg(**agg_rules).reset_index()
如果你的业务确实需要分两次聚合,第一次聚合时必须把后续分组要用到的所有列保留,不要直接全局求和:
# 第一次聚合:对目标列求和的同时,保留后续需要用到的维度列 first_agg = df.groupby(["Rider", "Hours", "T1 Delivered", "Minutes PD", "Delivery Success", "日期列"]).agg( # 此处填写需要求和的列 订单量="sum", 配送里程="sum" ).reset_index() # 第二次按日期维度聚合求均值 per_courier = first_agg.groupby("日期列").agg( avg_minutes_pd=("Minutes PD", "mean"), avg_delivery_success=("Delivery Success", "mean") ).reset_index()
内容的提问来源于stack exchange,提问作者cchev
相关产品推荐
相关产品推荐

