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
相关产品推荐
相关产品推荐

