Pandas のスタック解除の問題: ValueError: インデックスに重複したエントリが含まれているため、形状を変更できません 質問する

Pandas のスタック解除の問題: ValueError: インデックスに重複したエントリが含まれているため、形状を変更できません 質問する

私はパンダでマルチインデックスをアンスタックしようとしていますが、次のようなエラーが続きます:

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

別のオプション (集約したくない場合) は、ダミー レベルを追加し、スタックを解除してから、ダミー レベルを削除することです...

おすすめ記事