2012-08-30 52 views
14

非常に奇妙なバグです。私はいくつかのデータフレームをマージするためにパンダを使用しています。マージの一環として、reset_indexを何回か呼び出さなければなりません。しかし、私がそうすると、reset_indexの2回目か3回目の使用で予期せずクラッシュします。ここでパンダが繰り返し発生するとクラッシュするDataFrame.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 

ここで間違って何が起こっているのかすべてのアイデア:

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() 

ここでトレースバックの関連部分ですか?どのように私はそれを回避するのですか?

答えて

26

frame.pyを調べると、pandasが '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) 
+0

マルチインデックスレベルがケースには名前を持たない場合、元のフレームのインデックスに名前がない場合、またはパンダのみreset_index後に新しい列(複数可)の名前を設定しようとマルチインデックスのA.index.name = 'index1'; A = A.reset_index(); A.index.name = "index2"; A = A.reset_index(); A.index.name = 'index3'; A = A.reset_index()... 1つ行くことができます –

関連する問題