数量を持つインデックスで 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 を使用しています。