【问题标题】:Pandas crosstab on CategoricalDType columns throws TypeErrorCategoricalDType 列上的 Pandas 交叉表抛出 TypeError
【发布时间】:2019-06-12 22:52:36
【问题描述】:

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

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 返回 CategoricalDtype,该类型与 pd.crosstab documentation and example 中的类型相同,用于分类变量。

[更新]

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

【问题讨论】:

  • 你的 aggfunc 是什么?

标签: python pandas categories crosstab


【解决方案1】:

作为uncovered by OP,这是一个与旋转相关的issuecrosstabpivot_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.fooCut.dtypefootCutCategoricalDtype 它也没有被这样对待?看起来像挠头
  • @GeneBurinsky 我说原因可能是由于实现的变化,但这并不意味着这是预期的行为。这很可能是一个错误。需要做一些挖掘。值得庆幸的是,解决方法很明显,而且不像它本来可以做的那样 hack-ish。
猜你喜欢
  • 2020-09-05
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
相关资源
最近更新 更多