2012-08-30 25 views
14

Bug molto strano qui: sto usando i panda per unire diversi dataframes. Come parte dell'unione, devo richiamare reset_index più volte. Ma quando lo faccio, si blocca inaspettatamente sul secondo o terzo utilizzo di reset_index.pandas si blocca su DataFrame ripetuto.reset_index()

Ecco minima di codice per riprodurre l'errore:

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

Ecco la parte rilevante del traceback:

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

Qualsiasi idea di che cosa sta andando male qui? Come posso aggirarlo?

risposta

26

Ispezionando frame.py, sembra che i panda tentano di inserire una colonna 'indice' o 'livello_0'. Se entrambi/entrambi (??) sono già stati presi, allora genera l'errore.

Fortunatamente, c'è un'opzione "rilascia". AFAICT, questo elimina un indice esistente con lo stesso nome e lo sostituisce con il nuovo indice di reset. Questo potrebbe metterti nei guai se hai una colonna chiamata "indice", ma penso che tu stia bene.

codice "fissa":

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 solo tenta di impostare il nome della nuova colonna (s) dopo reset_index se l'indice di frame originale ha nome o se i livelli MultiIndex hanno nome in caso di 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() ... può andare –