2012-08-30 47 views
14

error muy extraño aquí: Estoy usando pandas para combinar varios dataframes. Como parte de la fusión, tengo que llamar a reset_index varias veces. Pero cuando lo hago, se bloquea inesperadamente en el segundo o tercer uso de reset_index.bloqueos de pandas en DataFrame.reset_index()

Aquí hay código mínimo para reproducir el error:

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

Aquí está la parte correspondiente del rastreo:

.... 
    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 

Cualquier idea de lo que va mal aquí? ¿Cómo puedo solucionarlo?

Respuesta

26

Al inspeccionar frame.py, parece que pandas intenta insertar una columna 'index' o 'level_0'. Si cualquiera/ambos (??) de ellos ya están tomados, entonces arroja el error.

Afortunadamente, hay una opción de "soltar". AFAICT, esto suelta un índice existente con el mismo nombre y lo reemplaza con el nuevo índice de reinicio. Esto podría ocasionarle problemas si tiene una columna llamada "índice", pero creo que de lo contrario está bien.

"Fixed" código:

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

pandas sólo se trata de establecer el nombre de la nueva columna (s) después reset_index si el índice de la trama original no tiene nombre o si los niveles MultiIndex no tienen nombre en el caso de un 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() ... puede ir uno –