Pandas中基于分组实现多列求和后累计和(cumsum)的问题
解决分组后多列合并累计和的问题
嘿,我完全懂你的需求——你要的不是每一列单独的累计和,而是把oil_prod_rb、water_prod_rb、gas_prod_rb这三列先加总,再对这个合并后的数值按分组做时间维度的累计求和对吧?我来给你一步步拆解实现方法:
步骤1:筛选数据并新增合并求和列
首先保留你原来的.loc筛选逻辑,同时新增一列把三列的产量加总起来,这样后续只需要对这一列做累计:
# 筛选符合条件的行,并保留必要字段(包括book_date用于排序) filtered_data = df.loc[ df['book_date'] >= df['wf_start_date'], ['patternname', 'patternset', 'oil_prod_rb', 'water_prod_rb', 'gas_prod_rb', 'book_date'] ].assign( # 新增合并后的总产量列 total_production=lambda x: x['oil_prod_rb'] + x['water_prod_rb'] + x['gas_prod_rb'] )
步骤2:分组后按日期排序并计算累计和
因为累计和必须按时间顺序计算,所以每个分组内要先按book_date排序,再对合并后的总产量列做.cumsum():
# 按patternname和patternset分组,组内排序后计算累计和 result = filtered_data.groupby(['patternname', 'patternset'], as_index=False).apply( lambda group: group.sort_values('book_date').assign( cumulative_total=lambda x: x['total_production'].cumsum() ) ).reset_index(drop=True) # 如果只需要核心结果列,可以筛选出需要的字段 final_output = result[['patternname', 'patternset', 'book_date', 'cumulative_total']]
关键说明
- 一定要在分组内先按
book_date排序!如果原始数据的日期不是按顺序排列的,直接做累计和会得到错误的结果。 - 使用
.assign()方法可以链式操作,避免创建中间变量,让代码更简洁。 - 如果你的
book_date是字符串格式,记得先转成 datetime 类型再排序,否则可能会出现排序混乱的情况。
内容的提问来源于stack exchange,提问作者Quasar
相关产品推荐
相关产品推荐

