来自 pd.crosstab 的 pandas 文档:
“任何包含类别数据的输入都会将其类别的所有包含在交叉表中,即使实际数据不包含特定类别的任何实例。”
那么我在下面的代码片段中实际上做错了什么(最终输出不包含所有级别)
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() # this properly includes all the levels - even unused
pd.crosstab(index=d_cat["x"], columns=d_cat["y"])
#y a b
#x
#a 1 2
您应该按照
dropna=False
文档中所述使用
crosstab
(请参阅示例):
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