Pandas CategoricalDType 列上的交叉表抛出 TypeError

Pandas crosstab on CategoricalDType columns throws TypeError

考虑这个简单的数据集,其列被分位数切割。

kyle = pd.DataFrame({'foo':np.random.randint(0,100,100),'boo':np.random.randint(0,100,100)})
kyle.loc[:,'fooCut'] = pd.qcut(kyle.loc[:,'foo'], np.arange(0,1.1,.1))
kyle.loc[:,'booCut'] = pd.qcut(kyle.loc[:,'boo'], np.arange(0,1.1,.1))

Pandas 的先前版本按预期处理了以下内容...

pd.crosstab(kyle.fooCut,kyle.booCut)

更新到“0.24.2”版本后,上面的内容给我一个 TypeError: Cannot cast array data from dtype('float64') to dtype('<U32') according to the rule 'safe'

有谁知道为什么以及如何解决这个问题? 注意这里,kyle.boocut.dtypereturnsCategoricalDtype,与pd.crosstabdocumentation and example中的类型相同分类变量。

[更新]

这是 pandas 中已知的 bug,正在修复

因为 , this is an issue 与旋转相关(crosstabpivot_table 的优化版本)间隔列,目前正在针对 v0.25 进行修复。

这是一个涉及交叉制表整数代码的解决方法:

cstab = pd.crosstab(kyle.fooCut.cat.codes, kyle.booCut.cat.codes)
cstab


col_0  0  1  2  3  4  5  6  7  8  9
row_0                              
0      0  2  0  1  3  1  2  1  1  1
1      1  1  0  1  1  2  1  0  1  2
2      2  1  1  0  1  1  2  0  0  0
3      2  1  3  1  2  0  0  0  0  1
4      1  2  1  0  0  2  0  1  1  2
5      0  2  0  1  0  1  0  3  3  0
6      2  0  1  2  0  2  1  1  1  1
7      1  0  0  2  2  0  1  1  2  0
8      0  1  1  0  1  1  3  1  1  1
9      1  1  2  2  0  0  2  1  0  1

如果需要,您始终可以将结果的索引和列分配给实际类别:

cstab.index = kyle.fooCut.cat.categories
cstab.columns = kyle.booCut.cat.categories