Pandas dataframe fillna() solo algunas columnas en su lugar

Resuelto Sait asked hace 8 años • 10 respuestas

Estoy tratando de completar ninguno de los valores en un marco de datos de Pandas con 0 solo para un subconjunto de columnas.

Cuando lo hago:

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

La salida:

     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

Reemplaza cada uno Nonecon 0's. Lo que quiero hacer es solo reemplazar Nones en las columnas ay b, pero no c.

Cual es la mejor manera de hacer esto?

Sait avatar Jul 01 '16 05:07 Sait
Aceptado

Puede seleccionar las columnas que desee y hacerlo por tarea:

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

El resultado resultante es el esperado:

     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
root avatar Jun 30 '2016 22:06 root

Puedes usar dict, fillnacon diferentes valores para diferentes columnas.

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

Después de asignarlo nuevamente

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
BENY avatar Nov 15 '2017 18:11 BENY

Puedes evitar hacer una copia del objeto usando la solución de Wen e inplace=True:

df.fillna({'a':0, 'b':0}, inplace=True)
print(df)

Cuyos rendimientos:

     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
Leesa H. avatar Jun 10 '2018 02:06 Leesa H.