如何使用Pandas.groupby实现跨两列同值的累计求和计算
Pandas 跨两列分组累计求和实现方案
直接计算法(适用于固定少量类别场景)
无需分组操作,直接通过向量化运算实现,执行效率更高:
import pandas as pd # 初始数据构造 df = pd.DataFrame({ 'col_A': ['red', 'red', 'blue', 'red'], 'col_B': ['blue', 'red', 'blue', 'red'], 'col_A_qty': [1, 1, 1, 1], 'col_B_qty': [1, 1, 1, 1] }) # 计算每行对应颜色的新增数量 df['red_add'] = (df['col_A'] == 'red') * df['col_A_qty'] + (df['col_B'] == 'red') * df['col_B_qty'] df['blue_add'] = (df['col_A'] == 'blue') * df['col_A_qty'] + (df['col_B'] == 'blue') * df['col_B_qty'] # 累计求和 df['red_cumsum'] = df['red_add'].cumsum() df['blue_cumsum'] = df['blue_add'].cumsum() # 清理临时列 df.drop(columns=['red_add', 'blue_add'], inplace=True)
groupby 通用方案(适用于多类别场景)
如果颜色类别较多,可通过数据重塑+分组累计求和实现,满足你要求使用pandas.groupby的需求:
import pandas as pd df = pd.DataFrame({ 'col_A': ['red', 'red', 'blue', 'red'], 'col_B': ['blue', 'red', 'blue', 'red'], 'col_A_qty': [1, 1, 1, 1], 'col_B_qty': [1, 1, 1, 1] }) # 生成行索引用于后续合并 df['row_id'] = df.index # 宽表转长表,把两列颜色统一到同一列处理 long_df = pd.melt( df, id_vars=['row_id'], value_vars=['col_A', 'col_B'], var_name='col_flag', value_name='color' ) # 匹配对应列的数量 long_df['qty'] = long_df.apply(lambda x: df.loc[x['row_id'], f"{x['col_flag']}_qty"], axis=1) # 按颜色分组计算累计求和,再转回宽表 cumsum_res = long_df.groupby('color')['qty'].cumsum()\ .groupby([long_df['row_id'], long_df['color']]).last()\ .unstack(fill_value=0).groupby(level=0).last()\ .add_suffix('_cumsum') # 合并回原表 df = df.join(cumsum_res, on='row_id').drop(columns='row_id')
上述两种方法输出结果均和你期望的结果完全一致。
内容的提问来源于stack exchange,提问作者Luxo_Jr
相关产品推荐
相关产品推荐

