python - 使用 Pandas Multiindex 处理数量失败并显示 'Categorical levels must be unique'

标签 python pandas

在某些情况下,将 pandas MultiIndex 与具有数量的索引一起使用会失败。让我给你看一个例子:

import quantities as pq
import pandas as pd

i = np.arange(10) * pq.J
j = np.array([1 for _ in xrange(10)]) * pq.K

pd.MultiIndex.from_tuples(zip(i, j), names=['Energy', 'Temperature'])

此操作失败并出现以下回溯

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-86-c2d09517b80e> in <module>()
      5 j = np.array([1 for _ in xrange(10)]) * pq.K
      6 
----> 7 pd.MultiIndex.from_tuples(zip(i, j), names=['Energy', 'Temperature'])

C:\Python27\lib\site-packages\pandas\core\index.pyc in from_tuples(cls, tuples, sortorder, names)
   1685 
   1686         return MultiIndex.from_arrays(arrays, sortorder=sortorder,
-> 1687                                       names=names)
   1688 
   1689     @property

C:\Python27\lib\site-packages\pandas\core\index.pyc in from_arrays(cls, arrays, sortorder, names)
   1646             return Index(arrays[0], name=name)
   1647 
-> 1648         cats = [Categorical.from_array(arr) for arr in arrays]
   1649         levels = [c.levels for c in cats]
   1650         labels = [c.labels for c in cats]

C:\Python27\lib\site-packages\pandas\core\categorical.pyc in from_array(cls, data)
     59 
     60         return Categorical(labels, levels,
---> 61                            name=getattr(data, 'name', None))
     62 
     63     _levels = None

C:\Python27\lib\site-packages\pandas\core\categorical.pyc in __init__(self, labels, levels, name)
     45     def __init__(self, labels, levels, name=None):
     46         self.labels = labels
---> 47         self.levels = levels
     48         self.name = name
     49 

C:\Python27\lib\site-packages\pandas\core\categorical.pyc in _set_levels(self, levels)
     68         levels = _ensure_index(levels)
     69         if not levels.is_unique:
---> 70             raise ValueError('Categorical levels must be unique')
     71         self._levels = levels
     72 

ValueError: Categorical levels must be unique

如果我删除这些单元,它就可以正常工作。

i = np.arange(10)
j = np.array([1 for _ in xrange(10)])

pd.MultiIndex.from_tuples(zip(i, j), names=['Energy', 'Temperature'])

如果我保留单位,但对 j 使用唯一的项目,它也有效。

i = np.arange(10) * pq.J
j = np.arange(10) * pq.K

pd.MultiIndex.from_tuples(zip(i, j), names=['Energy', 'Temperature'])

这当然不是选择,因为指数来自测量。我真的很想保留这些单位,但由于我不熟悉 pandas 内部结构,我不知道如何解决这个问题。

版本

我在 python 2.7 中使用 pandas 版本 0.10.1 和数量 0.10.1。

最佳答案

我能够重现此错误,但它是间歇性的 在 Linux 上,每隔几次调用都会失败 pd.MultiIndex.from_tuples(...) .

我相信错误是由于quantity造成的违反的对象 a==b 的 Python 等式哈希不变量意味着hash(a)==hash(b) (来源:http://bugs.python.org/issue13707#msg150596https://groups.google.com/forum/#!msg/sympy/pJ2jg2csKgU/0nn21xqZEmwJ)。

不良哈希行为的示例。

In [5]: (1 * pq.K) == (1 * pq.K)
Out[5]: True

In [6]: hash(1 * pq.K) == hash(1 * pq.K)
Out[6]: False

根据这种行为,我认为这是一个数量问题, 导致 pandas 出现非法的内部状态。

IMO,最干净的解决方案是数量对象返回基于一致的哈希值 在当前值上,就像这个(被拒绝的)添加 __hash__() 的拉取请求一样数量对象上的函数: https://github.com/python-quantities/python-quantities/pull/29 .
要么这样,要么在尝试散列时抛出错误(如果需要的话) 表现得像一个可变对象。

关于python - 使用 Pandas Multiindex 处理数量失败并显示 'Categorical levels must be unique',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14849855/

相关文章:

python - 导入 Glib 时出错

python - 如何根据 Pandas 的日期填写数据

python - Pandas 不会 fillna() 到位

python - 如何修复 AttributeError : 'Series' object has no attribute 'to_numpy'

python - 根据其他列值创建 Pandas Dataframe 行

python - 有没有办法知道 Unicode 字符串是否包含 Python 中的任何中文/日文字符?

python - Instant search with Whoosh - 使用 Woosh 输出 JSON 结果索引和搜索 MySQL 表

python - 将参数写入文本文件

python - 使用 cx_Oracle 调用函数时表达式类型错误

python - 从文件中检索与文件中指定的给定区域相对应的数字