pandas Categorical列groupby.size统计多余0值是否正常?如何解决
行为逻辑说明
当你使用pd.Categorical设置字段为分类类型时,pandas的groupby操作默认会对所有分类字段的预定义类别做笛卡尔积展开,即使部分类别组合在原始数据中从未出现,也会保留在分组结果中,对应不存在的组合计数返回0,这就是你看到大量0值无效行的原因。
你的示例中city的分类为['Loa', 'Porto'],town的分类为['A','B','C'],默认分组时会生成2*3=6组全量组合,才会出现Loa+A、Loa+B、Porto+C这类无数据的分组。
无需修改字段类型的解决方法
直接在groupby中传入参数observed=True即可,该参数会强制分组操作仅统计原始数据中实际存在的类别组合,自动过滤掉无数据的0值分组。
对应代码如下:
# 仅需新增observed=True参数,不需要修改原有字段的Categorical类型 mydf.groupby(['city','town'], observed=True).size().to_frame()
运行后返回的结果完全符合预期:
0 city town Loa C 2 Porto A 2 B 1
注:
observed参数从pandas 1.1.0版本开始正式支持,默认值为False,即对分类类型字段默认枚举全量类别组合。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

