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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:06:09