2013-07-15 10 views
6

consideri il seguente dataframeUtilizzo di un dizionario di sostituire valori di colonna su determinati numeri indice su una dataframe pandi

df_test = pd.DataFrame({'a' : [1, 2, 8], 'b' : [np.nan, np.nan, 5], 'c' : [np.nan, np.nan, 4]}) 
df_test.index = ['one', 'two', 'three'] 

che dà

 a b c 
one 1 NaN NaN 
two 2 NaN NaN 
three 8 5 4 

ho un dizionario di sostituzioni di riga per b e c colonne . Per esempio:

{ 'one': [3.1, 2.2], 'two' : [8.8, 4.4] } 

dove 3.1 e 8.8 sostituisce b colonna e 2.2 e 4.4 sostituisce la colonna C, in modo che il risultato sia

 a b c 
one 1 3.1 2.2 
two 2 8.8 4.4 
three 8 5 4 

io so come fare questi cambiamenti con un ciclo for:

index_list = ['one', 'two'] 
value_list_b = [3.1, 8.8] 
value_list_c = [2.2, 4.4] 
for i in range(len(index_list)): 
    df_test.ix[df_test.index == index_list[i], 'b'] = value_list_b[i] 
    df_test.ix[df_test.index == index_list[i], 'c'] = value_list_c[i] 

ma sono sicuro che c'è un modo più bello e più veloce per usare il dizionario!

Immagino che si possa fare con il metodo DataFrame.replace, ma non riuscivo a capirlo.

Grazie per l'aiuto,

cd

risposta

4

Siete alla ricerca di DataFrame.update. L'unico vantaggio nel tuo caso è che tu specifichi gli aggiornamenti come un dizionario di righe, mentre un DataFrame viene solitamente creato da un dizionario di colonne. La parola chiave orient può gestirlo.

In [25]: df_test 
Out[25]: 
     a b c 
one 1 NaN NaN 
two 2 NaN NaN 
three 8 5 4 

In [26]: row_replacements = { 'one': [3.1, 2.2], 'two' : [8.8, 4.4] } 

In [27]: df_update = DataFrame.from_dict(row_replacements, orient='index') 

In [28]: df_update.columns = ['b', 'c'] 

In [29]: df_test.update(df_update) 

In [30]: df_test 
Out[30]: 
     a b c 
one 1 3.1 2.2 
two 2 8.8 4.4 
three 8 5.0 4.0 

from_dict è un costruttore dataframe specifico che ci dà la parola chiave orient, non è disponibile se hai appena detto DataFrame(...). Per ragioni che non conosco, non possiamo passare i nomi delle colonne da ['b', 'c'] a from_dict, quindi li ho specificati in un passaggio separato.

+0

Questo funziona per me, grazie mille! – cd98

Problemi correlati