2013-01-01 12 views
15

Ho un df:Come modificare il valore dell'indice del dataframe di Pandas?

>>> df 
        sales  cash 
STK_ID RPT_Date     
000568 20120930 80.093 57.488 
000596 20120930 32.585 26.177 
000799 20120930 14.784 8.157 

e desideri modificare il valore di indice prima di fila dal ('000568','20120930') a ('000999','20121231'). Risultato finale sarà:

>>> df 
        sales  cash 
STK_ID RPT_Date     
000999 20121231 80.093 57.488 
000596 20120930 32.585 26.177 
000799 20120930 14.784 8.157 

come raggiungere questo obiettivo?

risposta

19

Con questa configurazione:

import pandas as pd 
import io 

text = '''\ 
STK_ID RPT_Date sales cash 
000568 20120930 80.093 57.488 
000596 20120930 32.585 26.177 
000799 20120930 14.784 8.157 
''' 

df = pd.read_csv(io.BytesIO(text), delimiter = ' ', 
       converters = {0:str}) 
df.set_index(['STK_ID','RPT_Date'], inplace = True) 

L'indice, df.index può essere riassegnato ad un nuovo MultiIndex simili:

index = df.index 
names = index.names 
index = [('000999','20121231')] + df.index.tolist()[1:] 
df.index = pd.MultiIndex.from_tuples(index, names = names) 
print(df) 
#     sales cash 
# STK_ID RPT_Date     
# 000999 20121231 80.093 57.488 
# 000596 20120930 32.585 26.177 
# 000799 20120930 14.784 8.157 

Oppure, l'indice potrebbe essere fatto in colonne, i valori in le colonne possono essere riassegnate e quindi le colonne restituite agli indici:

df.reset_index(inplace = True) 
df.ix[0, ['STK_ID', 'RPT_Date']] = ('000999','20121231') 
df = df.set_index(['STK_ID','RPT_Date']) 
print(df) 

#     sales cash 
# STK_ID RPT_Date     
# 000999 20121231 80.093 57.488 
# 000596 20120930 32.585 26.177 
# 000799 20120930 14.784 8.157 

comparativa con IPython %timeit suggerisce riassegnazione l'indice (il primo metodo, sopra) è significativamente più veloce di reimpostare l'indice, modificando i valori di colonna e quindi impostare nuovamente l'indice (il secondo metodo, sopra):

In [2]: %timeit reassign_index(df) 
10000 loops, best of 3: 158 us per loop 

In [3]: %timeit reassign_columns(df) 
1000 loops, best of 3: 843 us per loop 
+0

Funziona! Grazie ! – bigbug