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

Pandas使用groupby sum分组求和结果被异常倍增如何解决

Pandas groupby求和结果倍增问题修复方案

问题根源

transform方法会将分组聚合结果回填到分组内的所有行,你在未去重的原始重复行上直接执行更高维度的聚合求和,同一个数值被重复计算了N次(N为对应分组的行数),最终导致结果倍增。

修正后完整代码

import pandas as pd

data = {'Date': ['10/10/21', '10/10/21', '13/10/21', '11/10/21', '11/10/21', '11/10/21', '11/10/21', '11/10/21', '13/10/21', '13/10/21', '13/10/21', '10/10/21', '10/10/21'],
      'ID': [1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
      'TotalTimeSpentInMinutes': [19, 6, 14, 17, 51, 53, 66, 19, 14, 28, 44, 22, 41],
      'Vehicle': ['V3', 'V1', 'V3', 'V1','V1','V1','V1','V1','V1','V1','V1','V1','V1']
      }

df = pd.DataFrame(data)

prices = {
    'V1': 9.99,
    'V2': 9.99,
    'V3': 14.00,
}

default_price = 9.99

df = df.sort_values('ID')

# 先计算[ID, Date, Vehicle]维度的聚合指标
df['OrdersPD'] = df.groupby(['ID', 'Date', 'Vehicle'])['ID'].transform('count')
df['MinutesPD'] = df.groupby(['ID', 'Date', 'Vehicle'])['TotalTimeSpentInMinutes'].transform(sum)
df['HoursPD'] = df['MinutesPD'] / 60
df['Pay excl extra'] = df.apply(lambda x: prices[x.get('Vehicle', default_price)]*x['HoursPD'], axis=1).round(2)

extra = 1.20
df['Extra Pay'] = df.apply(lambda x: extra*x['OrdersPD'], axis=1)
df['Total_pay'] = df['Pay excl extra'] + df['Extra Pay'].round(2)

# 先去重,避免后续聚合重复计算
df.drop_duplicates((['ID','Date','Vehicle']), inplace=True)

# 修正分组维度:单ID单日期总薪资,按ID+Date分组
df['Total Pay PD'] = df.groupby(['ID', 'Date'])['Total_pay'].transform(sum)

# 计算ID维度的总工时和总薪资
df['Total Courier Hours'] = df.groupby(['ID'])['HoursPD'].transform(sum).round(2)
df['ABS Final Pay'] = df.groupby(['ID'])['Total Pay PD'].transform(sum).round(2)

print(df)

关键修改说明

  • 调整操作顺序:先完成[ID, Date, Vehicle]维度的去重,再执行更高维度的聚合计算,确保所有参与求和的数值都是唯一值,不会重复计数
  • 修正Total Pay PD的分组规则:将原仅按ID分组的逻辑改为按[ID, Date]分组,匹配单ID单日期总薪资的统计需求
  • 优化聚合逻辑:删除重复冗余的聚合步骤,所有高维度统计都基于去重后的数据集计算,最终得到的ID1总薪资为12.30、ID2总工时为5.91,完全符合预期结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:36:04