python - una - pandas DataFrame: reemplace los valores de nan con el promedio de columnas
seleccionar columnas pandas python (7)
Tengo un DataFrame de pandas llenado principalmente con números reales, pero también hay algunos valores nan
.
¿Cómo puedo reemplazar las nan
con los promedios de las columnas donde están?
Esta pregunta es muy similar a esta: matriz numpy: reemplace los valores de nan con el promedio de las columnas , pero desafortunadamente, la solución dada allí no funciona para un DataFrame de pandas.
Otra opción además de las anteriores es:
df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))
Es menos elegante que las respuestas anteriores para la media, pero podría ser más corto si desea reemplazar valores nulos por alguna otra función de columna.
Si desea imputar valores perdidos con la media y desea ir columna por columna, esto solo imputará con la media de esa columna. Esto podría ser un poco más legible.
sub2[''income''] = sub2[''income''].fillna((sub2[''income''].mean()))
Simplemente puede usar DataFrame.fillna
para llenar el nan
''s directamente:
In [27]: df
Out[27]:
A B C
0 -0.166919 0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 NaN -2.027325 1.533582
4 NaN NaN 0.461821
5 -0.788073 NaN NaN
6 -0.916080 -0.612343 NaN
7 -0.887858 1.033826 NaN
8 1.948430 1.025011 -2.982224
9 0.019698 -0.795876 -0.046431
In [28]: df.mean()
Out[28]:
A -0.151121
B -0.231291
C -0.530307
dtype: float64
In [29]: df.fillna(df.mean())
Out[29]:
A B C
0 -0.166919 0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 -0.151121 -2.027325 1.533582
4 -0.151121 -0.231291 0.461821
5 -0.788073 -0.231291 -0.530307
6 -0.916080 -0.612343 -0.530307
7 -0.887858 1.033826 -0.530307
8 1.948430 1.025011 -2.982224
9 0.019698 -0.795876 -0.046431
El docstring de fillna
dice que el value
debe ser un escalar o un dict, sin embargo, parece funcionar también con una Series
. Si quiere pasar un dict, puede usar df.mean().to_dict()
.
Tratar:
sub2[''income''].fillna((sub2[''income''].mean()), inplace=True)
Utilice directamente df.fillna(df.mean())
para llenar todo el valor nulo con la media
Si desea completar el valor nulo con la media de esa columna, puede usar esto
supongamos que x=df[''Item_Weight'']
aquí Item_Weight
es el nombre de la columna
aquí estamos asignando (llene los valores nulos de x con la media de x en x)
df[''Item_Weight''] = df[''Item_Weight''].fillna((df[''Item_Weight''].mean()))
Si desea completar el valor nulo con alguna cadena, utilice
aquí Outlet_size
es el nombre de la columna
df.Outlet_Size = df.Outlet_Size.fillna(''Missing'')
# To read data from csv file
Dataset = pd.read_csv(''Data.csv'')
# To divide input in X and y axis
X = Dataset.iloc[:, :-1].values
Y = Dataset.iloc[:, 3].values
# To calculate mean use imputer class
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values=''NaN'', strategy=''mean'', axis=0)
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])
In [16]: df = DataFrame(np.random.randn(10,3))
In [17]: df.iloc[3:5,0] = np.nan
In [18]: df.iloc[4:6,1] = np.nan
In [19]: df.iloc[5:8,2] = np.nan
In [20]: df
Out[20]:
0 1 2
0 1.148272 0.227366 -2.368136
1 -0.820823 1.071471 -0.784713
2 0.157913 0.602857 0.665034
3 NaN -0.985188 -0.324136
4 NaN NaN 0.238512
5 0.769657 NaN NaN
6 0.141951 0.326064 NaN
7 -1.694475 -0.523440 NaN
8 0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794
In [22]: df.mean()
Out[22]:
0 -0.251534
1 -0.040622
2 -0.841219
dtype: float64
Aplicar por columna la media de esas columnas y llenar
In [23]: df.apply(lambda x: x.fillna(x.mean()),axis=0)
Out[23]:
0 1 2
0 1.148272 0.227366 -2.368136
1 -0.820823 1.071471 -0.784713
2 0.157913 0.602857 0.665034
3 -0.251534 -0.985188 -0.324136
4 -0.251534 -0.040622 0.238512
5 0.769657 -0.040622 -0.841219
6 0.141951 0.326064 -0.841219
7 -1.694475 -0.523440 -0.841219
8 0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794