如何按多列聚合并展平Pandas DataFrame
解决方案
要实现你需要的分组聚合并展平结果的需求,可以通过分组聚合+unstack展平+列重命名+合并结果这几个步骤完成,具体如下:
步骤1:定义单个分类列的处理逻辑
对每个分类列(cat1/cat2),先按a和分类列分组求和,再用unstack()把分类值转为列,最后重命名列名匹配你的期望格式:
def process_category(df, cat_col): # 按a和分类列分组,对is、fs列求和 grouped = df.groupby(['a', cat_col])[['is', 'fs']].sum() # 把分类列的不同取值转为列(完成展平) unstacked = grouped.unstack(level=cat_col) # 重命名列,生成sum(is|cat1=C)这类格式的表头 unstacked.columns = [f"sum({col}|{cat_col}={cat_val})" for col, cat_val in unstacked.columns] # 重置索引,将a从索引转为普通列 return unstacked.reset_index()
步骤2:处理两个分类列并合并结果
调用上述函数分别处理cat1和cat2,再通过merge()按a列合并结果:
import pandas as pd # 你的原始DataFrame df = pd.DataFrame({'a':['a1','a1','a1','a2','a2','a3','a3','a3','a3'], 'cat1':['C','D','D','C','D','D','D','D','C'], 'cat2':['X','Y','X','Y','X','Y','X','Y','X'], 'is':[1,2,3,1,2,1,2,3,4], 'fs':[.1,.2,.3,.1,.2,.1,.2,.3,.4]}) # 分别处理cat1和cat2 df_cat1 = process_category(df, 'cat1') df_cat2 = process_category(df, 'cat2') # 按a合并两个结果表 final_df = pd.merge(df_cat1, df_cat2, on='a')
步骤3:查看最终输出
运行后final_df的结果与你的期望完全一致:
a sum(is|cat1=C) sum(fs|cat1=C) sum(is|cat1=D) sum(fs|cat1=D) sum(is|cat2=X) sum(fs|cat2=X) sum(is|cat2=Y) sum(fs|cat2=Y) 0 a1 1 0.1 5 0.5 4 0.4 2 0.2 1 a2 1 0.1 2 0.2 2 0.2 1 0.1 2 a3 4 0.4 6 0.6 6 0.6 4 0.4
关键逻辑说明
unstack(level=cat_col):将分组后的二级索引(分类列的不同取值)转为列,这是解决你当前结果未展开的核心操作。- 列重命名时利用了MultiIndex的结构,直接遍历组合出你需要的格式。
- 最后用
merge()按a合并两个处理后的DataFrame,实现cat1和cat2结果的整合。
内容的提问来源于stack exchange,提问作者nuges01
相关产品推荐
相关产品推荐

