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.dtype
returnsCategoricalDtype
,与pd.crosstab
documentation and example中的类型相同分类变量。
[更新]
这是 pandas 中已知的 bug,正在修复
因为 , this is an issue 与旋转相关(crosstab
是 pivot_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
考虑这个简单的数据集,其列被分位数切割。
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.dtype
returnsCategoricalDtype
,与pd.crosstab
documentation and example中的类型相同分类变量。
[更新]
这是 pandas 中已知的 bug,正在修复
因为 crosstab
是 pivot_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