2012-08-30 8 views
14

아주 이상한 버그가 있습니다. 팬더를 사용하여 여러 데이터 프레임을 병합했습니다. 병합의 일부로 reset_index를 여러 번 호출해야합니다. 하지만 그렇게하면 reset_index의 두 번째 또는 세 번째 사용시 예기치 않게 충돌합니다.pandas가 반복적으로 충돌합니다. 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 후 새 열 (들)의 이름을 설정하려고 시도하거나 MultiIndex 수준은 경우에는 이름이없는 경우 MultiIndex의 A.index.name = 'index1'; A = A.reset_index(); A.index.name = "index2"; A = A.reset_index(); A.index.name = 'index3'; A = A.reset_index() ... 하나를 수행 할 수 있습니다. –

관련 문제