with specific dropna column python pandas dataframe

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''