使用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
相关产品推荐
相关产品推荐

