45

ここでの非常に奇妙なバグ:パンダを使用して複数のデータフレームをマージしています。マージの一環として、reset_indexを数回呼び出す必要があります。しかし、そうすると、reset_indexの2回目または3回目の使用で予期せずクラッシュします。

エラーを再現するための最小限のコードは次のとおりです。

import pandas
A = pandas.DataFrame({
    'val' :  ['aaaaa', 'acaca', 'ddddd', 'zzzzz'],
    'extra' : range(10,14),
})
A = A.reset_index()
A = A.reset_index()
A = A.reset_index()

トレースバックの関連部分は次のとおりです。

....
    A = A.reset_index()
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 2393, in reset_index
    new_obj.insert(0, name, _maybe_cast(self.index.values))
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 1787, in insert
    self._data.insert(loc, column, value)
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/internals.py", line 893, in insert
    raise Exception('cannot insert %s, already exists' % item)
Exception: cannot insert level_0, already exists

ここで何が問題になっているのでしょうか。どうすれば回避できますか?

4

2 に答える 2

89

frame.pyを調べると、パンダが列「index」または「level_0」を挿入しようとしているようです。それらのいずれか/両方(??)がすでに取得されている場合は、エラーがスローされます。

幸いなことに、「ドロップ」オプションがあります。AFAICT、これは同じ名前の既存のインデックスを削除し、新しいリセットされたインデックスに置き換えます。「index」という名前の列がある場合は問題が発生する可能性がありますが、それ以外の場合は問題ないと思います。

「修正された」コード:

import pandas
A = pandas.DataFrame({
    'val' :  ['aaaaa', 'acaca', 'ddddd', 'zzzzz'],
    'extra' : range(10,14),
})
A = A.reset_index(drop=True)
A = A.reset_index(drop=True)
A = A.reset_index(drop=True)
于 2012-08-30T19:52:44.037 に答える
0

あなたが使用することができます:

A.reset_index(drop=True, inplace=True)

于 2021-03-14T03:42:38.443 に答える