私はパンダでマルチインデックスをアンスタックしようとしていますが、次のようなエラーが続きます:
ValueError: Index contains duplicate entries, cannot reshape
4 つの列を持つデータセットがあるとします。
- id (文字列)
- 日付 (文字列)
- 場所 (文字列)
- 値(浮動小数点数)
まず、3 レベルのマルチインデックスを設定します。
In [37]: e.set_index(['id', 'date', 'location'], inplace=True)
In [38]: e
Out[38]:
value
id date location
id1 2014-12-12 loc1 16.86
2014-12-11 loc1 17.18
2014-12-10 loc1 17.03
2014-12-09 loc1 17.28
次に、場所のスタックを解除してみます。
In [39]: e.unstack('location')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-39-bc1e237a0ed7> in <module>()
----> 1 e.unstack('location')
...
C:\Anaconda\envs\sandbox\lib\site-packages\pandas\core\reshape.pyc in _make_selectors(self)
143
144 if mask.sum() < len(self.index):
--> 145 raise ValueError('Index contains duplicate entries, '
146 'cannot reshape')
147
ValueError: Index contains duplicate entries, cannot reshape
ここで何が起こっているのですか?
ベストアンサー1
これは、同じインデックスを持つ重複した値を持つ、これを示す DataFrame の例です。問題は、これらを集約するか、複数の行として保持するかということです。
In [11]: df
Out[11]:
0 1 2 3
0 1 2 a 16.86
1 1 2 a 17.18
2 1 4 a 17.03
3 2 5 b 17.28
In [12]: df.pivot_table(values=3, index=[0, 1], columns=2, aggfunc='mean') # desired?
Out[12]:
2 a b
0 1
1 2 17.02 NaN
4 17.03 NaN
2 5 NaN 17.28
In [13]: df1 = df.set_index([0, 1, 2])
In [14]: df1
Out[14]:
3
0 1 2
1 2 a 16.86
a 17.18
4 a 17.03
2 5 b 17.28
In [15]: df1.unstack(2)
ValueError: Index contains duplicate entries, cannot reshape
1 つの解決策は、reset_index
(そして に戻ってdf
) を使用することですpivot_table
。
In [16]: df1.reset_index().pivot_table(values=3, index=[0, 1], columns=2, aggfunc='mean')
Out[16]:
2 a b
0 1
1 2 17.02 NaN
4 17.03 NaN
2 5 NaN 17.28
別のオプション (集約したくない場合) は、ダミー レベルを追加し、スタックを解除してから、ダミー レベルを削除することです...