You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas groupby多分类列出现意外行,求替代转字符串的解决方法

Pandas多分类列Groupby出现不存在组合的解决方法

当使用Pandas的groupby()处理多列'categorical'类型数据时,会返回原数据中不存在的列组合行,复现示例如下:

测试数据准备

df = pd.DataFrame(['a','a','b','c'], columns=['C1'], dtype='category')
df['C2'] = pd.Series(['x','y','z','y']).astype('category')
df['V'] = 0

生成的基础DataFrame:

C1  C2  V
0   a   x   0
1   a   y   0
2   b   z   0
3   c   y   0

问题现象

直接按多列分组求和时,会出现原数据中不存在的C1与C2组合:

df.groupby(['C1','C2']).sum()

结果:

V
C1  C2  
a   x   0
    y   0
    z   0
b   x   0
    y   0
    z   0
c   x   0
    y   0
    z   0

除了将分类列转换为字符串外,还有以下几种解决方案:


方案1:添加observed=True参数

这是最简便的解决方式,在groupby中指定observed=True,仅保留数据中实际存在的分类组合:

df.groupby(['C1','C2'], observed=True).sum()

执行后结果仅包含原数据存在的行:

V
C1  C2  
a   x   0
    y   0
b   z   0
c   y   0

方案2:重置分类列的有效类别

如果不需要保留分类列的所有潜在类别,可以将分类列的categories重置为数据中实际出现的取值,之后再分组:

# 重置C1的类别为当前数据中存在的唯一值
df['C1'] = df['C1'].cat.set_categories(df['C1'].unique())
# 重置C2的类别为当前数据中存在的唯一值
df['C2'] = df['C2'].cat.set_categories(df['C2'].unique())

# 再次分组求和
df.groupby(['C1','C2']).sum()

该方法会修改原DataFrame的分类列属性,后续分组也只会生成实际存在的组合。

方案3:过滤分组结果(适用于数值列有区分的场景)

如果分组后的数值列有非零值,可以先分组后过滤掉数值为0的行(此方法依赖数值列的取值,通用性不如前两种):

# 分组时不设置索引,方便后续过滤
result = df.groupby(['C1','C2'], as_index=False).sum()
# 过滤掉V为0的行(示例中V全为0,实际场景根据数值列调整)
result = result[result['V'] != 0]

内容的提问来源于stack exchange,提问作者Pawel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:56:06