Creazione mia dataframe:valori di indice ridenominazione in dataframe multiindex
from pandas import *
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = zip(*arrays)
index = MultiIndex.from_tuples(tuples, names=['first','second'])
data = DataFrame(randn(8,2),index=index,columns=['c1','c2'])
data
Out[68]:
c1 c2
first second
bar one 0.833816 -1.529639
two 0.340150 -1.818052
baz one -1.605051 -0.917619
two -0.021386 -0.222951
foo one 0.143949 -0.406376
two 1.208358 -2.469746
qux one -0.345265 -0.505282
two 0.158928 1.088826
vorrei rinominare i "primi" valori di indice, come ad esempio "bar" -> "gatto", "baz" -> "cane ", ecc. Tuttavia, ogni esempio che ho letto funziona su un indice a livello singolo e/o su cicli attraverso l'intero indice per ricrearlo efficacemente da zero. Stavo pensando qualcosa come:
data = data.reindex(index={'bar':'cat','baz':'dog'})
ma questo non funziona, né mi aspetto davvero che funzioni su più indici. Posso fare una tale sostituzione senza dover scorrere l'intero indice del dataframe?
Inizia modifica
io sono riluttanti ad aggiornare a 0,13 fino al rilascio, quindi ho usato la seguente soluzione:
index = data.index.tolist()
for r in xrange(len(index)):
index[r] = (codes[index[r][0]],index[r][1])
index = pd.MultiIndex.from_tuples(index,names=data.index.names)
data.index = index
Dove si trova un precedente dizionario definito di codice: coppie di stringhe. Questo in realtà non è il risultato più grande di quello che mi aspettavo (impiega un paio di secondi per operare su ~ 1,1 milioni di righe). Non è bello come un one-liner, ma funziona.
End Modifica
Questa è attualmente una proposta di miglioramento per una versione futura di panda: https://github.com/pydata/pandas/issues/4160 (@unutbu soln funziona ATM però) – Jeff