2012-08-30 138 views
14

非常奇怪的錯誤在這裏:我使用熊貓合併幾個數據幀。作爲合併的一部分,我必須多次調用reset_index。但是當我這樣做時,第二次或第三次使用reset_index會意外崩潰。熊貓崩潰重複DataFrame.reset_index()

下面是最少的代碼重現錯誤:

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 

任何想法是怎麼回事錯在這裏?我如何解決它?

回答

26

檢查frame.py,它看起來像熊貓試圖插入一列'索引'或'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。 A.index.name ='index1'; A = A.reset_index(); A.index.name =「index2」; A = A.reset_index(); A.index.name ='index3'; A = A.reset_index()...可以去一個 –