Pandas多列分组需用列表传入groupby,生成MultiIndex;as_index=False可保留分组列为普通列;agg()支持按列指定不同聚合函数;分组后应先选列再聚合以避免报错;transform()可将组大小广播为新列。

如果您在使用Pandas进行数据聚合时,发现单列分组无法满足分析维度需求,则可能是由于需要同时依据多个业务字段划分数据子集。以下是实现groupby多列分组与多字段统计的具体操作步骤:
一、基础多列分组语法与索引行为
groupby支持将列表形式的多个列名作为分组键,生成多级索引(MultiIndex)结构;默认情况下,分组列会脱离原DataFrame成为行索引,便于后续按层级检索。
1、构造含多列的数据示例:
df = pd.DataFrame({'A': ['foo', 'foo', 'bar', 'bar'], 'B': ['one', 'two', 'one', 'two'], 'C': [1, 2, 3, 4], 'D': [5, 6, 7, 8]})
2、执行双列分组:
result = df.groupby(['A', 'B'])
3、验证分组对象类型:
print(type(result)) 输出
4、查看分组键结构:
print(result.groups) 可见键为元组如 ('foo', 'one')
二、保留分组列为普通列而非索引
当输出需直接用于导出或可视化时,as_index=False参数可避免生成MultiIndex,使分组列保留在结果DataFrame中作为常规列。
1、启用as_index=False参数:
result_flat = df.groupby(['A', 'B'], as_index=False).sum()
2、检查输出结构:
result_flat.columns 显示为 Index(['A', 'B', 'C', 'D']),无层级索引
3、对比默认行为:
df.groupby(['A', 'B']).sum().index 类型为 MultiIndex
三、对不同列应用不同聚合函数
多字段统计常需差异化处理:例如对数值列求和、对另一列计数、对日期列取最大值。agg()方法支持字典映射方式精准指定各列聚合逻辑。
1、定义聚合规则字典:
agg_dict = {'C': 'sum', 'D': ['mean', 'count']}
2、执行混合聚合:
result_mixed = df.groupby(['A', 'B']).agg(agg_dict)
3、观察列名变化:
result_mixed.columns 生成多级列索引:('C', 'sum'), ('D', 'mean'), ('D', 'count')
4、展平列名(可选):
result_mixed.columns = ['_'.join(col).strip() for col in result_mixed.columns.values]
四、分组后仅统计指定子集列
为提升计算效率并规避非数值列报错,应在分组后立即筛选目标列再聚合,而非对整个DataFrame调用聚合函数。
1、先选列再分组聚合:
subset_result = df.groupby(['A', 'B'])[['C']].sum()
2、验证数据类型安全:
df.groupby(['A', 'B'])[['C', 'D']].sum() 不会因B列非数值而报错
3、对比全表聚合风险:
df.groupby(['A', 'B']).sum() 将自动排除B列(字符串),但可能掩盖预期外的列丢失
五、获取每组行数并附加为新列
业务中常需同步返回各分组样本量,size()或count()可满足该需求;transform()方法能将标量结果广播回原始形状,适用于添加统计列。
1、使用transform添加计数列:
df['group_size'] = df.groupby(['A', 'B'])['C'].transform('size')
2、验证新增列一致性:
df[df['A']=='foo']['group_size'].nunique() == 1 表明同组内值完全相同
3、替代方案(仅返回汇总表):
size_only = df.groupby(['A', 'B']).size().reset_index(name='count')










