python - filling - pd fillna method
Marco de datos de pandas fillna() solo algunas columnas en su lugar (6)
Así es como puedes hacerlo todo en una línea:
df[[''a'', ''b'']].fillna(value=0, inplace=True)
Desglose:
df[[''a'', ''b'']]
selecciona las columnas para las que desea llenar los valores de NaN,
value=0
le dice que llene los NaN con cero, e
inplace=True
hará los cambios permanentes, sin tener que hacer Una copia del objeto.
Estoy tratando de completar ninguno de los valores en un marco de datos de Pandas con 0 para solo 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
None
con
0
''s.
Lo que quiero hacer es, solo reemplazar
None
s en las columnas
a
y
b
, pero no
c
.
Cual es la mejor manera de hacer esto?
O algo como:
df.loc[df[''a''].isnull(),''a'']=0
df.loc[df[''b''].isnull(),''b'']=0
y si hay más:
for i in your_list:
df.loc[df[i].isnull(),i]=0
Puede evitar hacer una copia del objeto utilizando 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
Puede seleccionar sus columnas deseadas y hacerlo por asignación:
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
Puede usar
dict
,
fillna
con 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 de nuevo
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
el uso de la respuesta superior produce una advertencia sobre la realización de cambios en una copia de un segmento df.
Suponiendo que tiene otras columnas, una mejor manera de hacerlo es pasar un diccionario:
df.fillna({''A'': ''NA'', ''B'': ''NA''}, inplace=True)