为何pd.crosstab未包含分类数据的所有层级?技术求助
问题
根据pandas官方文档中pd.crosstab的说明:“任何传入的包含分类数据的输入,其所有分类都将被包含在交叉表中,即使实际数据中没有特定分类的实例。”
但以下代码片段的最终输出并未包含所有层级,请问问题出在哪里?
import pandas as pd from pandas.api.types import CategoricalDtype as CD ctype = CD(categories=["a","b","c"]) d_cat = pd.DataFrame({"x": ["a","a","a"], "y": ["b","a","b"]}, dtype=ctype) d_cat["x"].dtype # 输出为category类型 d_cat["x"].value_counts() # 这里能正确显示所有层级,包括未使用的b和c pd.crosstab(index=d_cat["x"], columns=d_cat["y"]) # 输出结果: #y a b #x #a 1 2
问题原因
pd.crosstab默认参数dropna=True,该参数会自动排除所有单元格值全为0的行和列。你的分类数据中,x列的b、c层级,y列的c层级在交叉表中对应的所有单元格都是0,因此被默认过滤掉了。
解决方法
调用pd.crosstab时显式设置dropna=False,即可保留所有分类层级:
pd.crosstab(index=d_cat["x"], columns=d_cat["y"], dropna=False)
执行后输出会包含所有分类:
y a b c x a 1 2 0 b 0 0 0 c 0 0 0
需要注意的是:value_counts默认会展示所有分类(它的dropna参数仅针对NaN值,未出现的分类会显示0计数),但pd.crosstab的dropna逻辑不同,必须手动设置为False才能保留全0的分类行/列。
内容的提问来源于stack exchange,提问作者P.Jo
相关产品推荐
相关产品推荐

