python - specific - pandas fillna with mean
Fillna en columnas mĂșltiples en lugar en Python Pandas (4)
Encontré esta página mientras buscaba una respuesta a este problema, pero no me gustaron las respuestas existentes. Terminé encontrando algo mejor en la documentación de DataFrame.fillna , y pensé que contribuiría para cualquier otra persona que suceda con esto.
Si tiene varias columnas, pero solo desea reemplazar el NaN
en un subconjunto de ellas, puede usar:
df.fillna({''Name'':''.'', ''City'':''.''}, inplace=True)
Esto también le permite especificar diferentes reemplazos para cada columna. Y si desea seguir adelante y completar todos los valores NaN
restantes, puede simplemente lanzar otra fillna
al final:
df.fillna({''Name'':''.'', ''City'':''.''}, inplace=True).fillna(0, inplace=True)
Tengo un marco de datos de pandas de tipos mixtos, algunos son cadenas y algunos son números. Me gustaría reemplazar los valores NAN en columnas de cadena por ''.'', Y los valores NAN en columnas flotantes por 0.
Considera este pequeño ejemplo ficticio:
df = pd.DataFrame({''Name'':[''Jack'',''Sue'',pd.np.nan,''Bob'',''Alice'',''John''],
''A'': [1, 2.1, pd.np.nan, 4.7, 5.6, 6.8],
''B'': [.25, pd.np.nan, pd.np.nan, 4, 12.2, 14.4],
''City'':[''Seattle'',''SF'',''LA'',''OC'',pd.np.nan,pd.np.nan]})
Ahora, puedo hacerlo en 3 líneas:
df[''Name''].fillna(''.'',inplace=True)
df[''City''].fillna(''.'',inplace=True)
df.fillna(0,inplace=True)
Dado que este es un pequeño marco de datos, es probable que 3 líneas estén bien. En mi ejemplo real (que no puedo compartir aquí debido a razones de confidencialidad de los datos), tengo muchas más columnas de cadenas y columnas numéricas. Así que termino escribiendo muchas líneas solo para fillna. ¿Hay una forma concisa de hacer esto?
Puede listar las columnas de la cadena a mano o df.dtypes
de df.dtypes
. Una vez que tenga la lista de columnas de cadena / objeto, puede llamar a fillna
en todas esas columnas a la vez.
# str_cols = [''Name'',''City'']
str_cols = df.columns[df.dtypes==object]
df[str_cols] = df[str_cols].fillna(''.'')
df.fillna(0,inplace=True)
Puede utilizar apply
para sus columnas con la comprobación de dtype
si es numeric
o no marcando dtype.kind
:
res = df.apply(lambda x: x.fillna(0) if x.dtype.kind in ''biufc'' else x.fillna(''.''))
print(res)
A B City Name
0 1.0 0.25 Seattle Jack
1 2.1 0.00 SF Sue
2 0.0 0.00 LA .
3 4.7 4.00 OC Bob
4 5.6 12.20 . Alice
5 6.8 14.40 . John
definir una función:
def myfillna(series):
if series.dtype is pd.np.dtype(float):
return series.fillna(0)
elif series.dtype is pd.np.dtype(object):
return series.fillna(''.'')
else:
return series
puede agregar otras sentencias elif si desea rellenar una columna de un tipo diferente de alguna otra manera. Ahora aplique esta función en todas las columnas del marco de datos
df = df.apply(myfillna)
esto es lo mismo que ''in situ''