2016-06-30 25 views
29

Sto tentando di riempire nessun valore in un dataframe di Pandas con 0 per solo alcuni sottoinsiemi di colonne.Pandas dataframe fillna() solo alcune colonne sul posto

Quando faccio:

import pandas as pd 
df = pd.DataFrame(data={'a':[1,2,3,None],'b':[4,5,None,6],'c':[None,None,7,8]}) 
print df 
df.fillna(value=0, inplace=True) 
print df 

L'output:

 a b c 
0 1.0 4.0 NaN 
1 2.0 5.0 NaN 
2 3.0 NaN 7.0 
3 NaN 6.0 8.0 
    a b c 
0 1.0 4.0 0.0 
1 2.0 5.0 0.0 
2 3.0 0.0 7.0 
3 0.0 6.0 8.0 

Esso sostituisce ogni None con 0 's. Quello che voglio fare è, sostituire solo None s nelle colonne a e b, ma non c.

Qual è il modo migliore per farlo?

risposta

54

È possibile selezionare le colonne desiderate e lo fa per l'assegnazione:

df[['a', 'b']] = df[['a','b']].fillna(value=0) 

L'output risultante è come previsto:

 a b c 
0 1.0 4.0 NaN 
1 2.0 5.0 NaN 
2 3.0 0.0 7.0 
3 0.0 6.0 8.0 
+0

Sì, questo è esattamente quello che voglio! Grazie. Qualche modo per farlo? Il mio dataframe originale è piuttosto grande. – Sait

+1

Non penso che ci sia un guadagno in termini di prestazioni in questo modo, dato che si sta sovrascrivendo l'orig df in ogni caso – EdChum

+2

La loc è superflua qui, 'df [['a', 'b']] = df [[' a ',' b ']]. fillna (valore = 0) 'funzionerà ancora – EdChum

12

È possibile utilizzare dict, fillna con valore diverso per differenti colonna

df.fillna({'a':0,'b':0}) 
Out[829]: 
    a b c 
0 1.0 4.0 NaN 
1 2.0 5.0 NaN 
2 3.0 0.0 7.0 
3 0.0 6.0 8.0 

Dopo averlo restituito

df=df.fillna({'a':0,'b':0}) 
df 
Out[831]: 
    a b c 
0 1.0 4.0 NaN 
1 2.0 5.0 NaN 
2 3.0 0.0 7.0 
3 0.0 6.0 8.0 
Problemi correlati