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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:45:03