2

数量を持つインデックスで 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'])

インデックスは測定値から得られるため、これはもちろんオプションではありません。ユニットを保持したいのですが、パンダの内部構造に慣れていないため、これを修正する方法がわかりません。

バージョン

Python 2.7 で pandas バージョン 0.10.1 と数量 0.10.1 を使用しています。

4

1 に答える 1

2

このエラーを再現することはできましたが、Linuxでは断続的に発生し、の呼び出しが数回失敗するたびに失敗します pd.MultiIndex.from_tuples(...)

quantityこのエラーは、オブジェクトがPythonの等式ハッシュ不変条件に違反していることが原因であると考えています (出典:http://bugs.python.org/issue13707#msg150596、httpsa==b//groups.google.com/forum/# !msg / sympy / pJ2jg2csKgU / 0nn21xqZEmwJ)。hash(a)==hash(b)

悪いハッシュ動作の例。

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

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

この振る舞いに基づいて、これはパンダの違法な内部状態につながる量の問題であると私は信じています。

__hash__()IMO、最もクリーンな解決策は、数量オブジェクトに関数 を追加するためのこの(拒否された)プルリクエストのように、数量オブジェクトが現在の値に基づいてコンシステントハッシュを返すことです: https ://github.com/python-quantities/python -数量/プル/29
それか、可変オブジェクトのように動作させたい場合は、ハッシュの試行でエラーをスローします。

于 2013-02-21T08:29:35.477 に答える