2012-08-30 99 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()...可以去一个 –