Pandas DataFrame: reemplace los valores de nan con el promedio de columnas


Respuestas:


273

Simplemente puede usar DataFrame.fillnapara llenar los 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 fillnadice que valuedebería ser un escalar o un dict, sin embargo, parece funcionar también con un Series. Si quieres aprobar un dict, puedes usarlo df.mean().to_dict().


10
df.fillna(df.mean())devolverá el nuevo marco de datos, por lo que deberá escribir df=df.fillna(df.mean())para conservarlo.
Yannis

¿Alguna idea de por qué podría estar imputando la cantidad incorrecta para la media usando esto?
bernando_vialli

25
En lugar de df=df.fillna(df.mean())usted también podría usardf.fillna(df.mean(), inplace=True)
Anderson Pimentel

20
PRECAUCIÓN: si desea usar esto para Aprendizaje automático / Ciencia de datos: desde la perspectiva de la Ciencia de datos, es incorrecto reemplazar primero a NA y luego dividirlo en tren y prueba ... Primero DEBE dividirse en tren y prueba, luego reemplace NA por significa en el tren y luego aplica este modelo de preprocesamiento con estado para probar, ¡mira la respuesta que implica sklearn a continuación!
Fabian Werner

2
@ amalik2205 porque, de lo contrario, está filtrando información del conjunto de pruebas al conjunto de entrenamiento. Imagínelo así: tenemos 100 filas de datos y consideramos la columna x. Las primeras 99 entradas de x son NA. Queremos dividir la fila 100 como un conjunto de prueba. Supongamos que la fila 100 tiene el valor 20 en la columna x. Luego reemplazará todas las entradas en el conjunto de entrenamiento en la columna x con 20, un valor que proviene al 100% del conjunto de prueba. Por lo tanto, ¡la evaluación puede engañarte!
Fabian Werner


28
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

Aplique por columna la media de esas columnas y complete

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

55
No sé por qué, pero df.fillna (df.mean ()) no funcionó, solo se aplica su versión con. Python 3
Rocketq

12
# To read data from csv file
Dataset = pd.read_csv('Data.csv')

X = Dataset.iloc[:, :-1].values

# To calculate mean use imputer class
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])

¿Cuál es la ventaja de todo esto sobre las alternativas mucho más simples?
AMC

@Roshan Jha Siempre es mejor explicar la lógica. Hay muchas formas de hacer la misma tarea en R & Python. Sin embargo, si está sugiriendo algo diferente, es posible que desee señalar algunas ventajas de hacerlo
Dra. Nisha Arora

10

Si desea imputar valores perdidos con media y desea ir columna por columna, entonces 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()))

3
Proporcione alguna explicación de cómo esto resuelve el problema.
Gurwinder Singh

10

Use directamente df.fillna(df.mean())para llenar todo el valor nulo con media

Si desea completar el valor nulo con la media de esa columna, puede usar esto

supongamos que x=df['Item_Weight']aquí Item_Weightestá el nombre de la columna

aquí estamos asignando (rellene 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, use

aquí Outlet_sizeestá el nombre de la columna

df.Outlet_Size = df.Outlet_Size.fillna('Missing')

9

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 los valores nulos por alguna otra función de columna.


7

Pandas: cómo reemplazar los nanvalores de NaN ( ) con el promedio (media), mediana u otras estadísticas de una columna

Digamos que su DataFrame es dfy tiene una columna llamada nr_items. Esto es: df['nr_items']

Si desea reemplazar los NaNvalores de su columna df['nr_items']con la media de la columna :

Método de uso .fillna():

mean_value=df['nr_items'].mean()
df['nr_item_ave']=df['nr_items'].fillna(mean_value)

He creado una nueva dfcolumna llamada nr_item_avepara almacenar la nueva columna con los NaNvalores reemplazados por el meanvalor de la columna.

Debe tener cuidado al usar el mean. Si tiene valores atípicos es más recomendable usar elmedian


0

utilizando la clase de preprocesamiento de la biblioteca sklearn

from sklearn.impute import SimpleImputer
missingvalues = SimpleImputer(missing_values = np.nan, strategy = 'mean', axis = 0)
missingvalues = missingvalues.fit(x[:,1:3])
x[:,1:3] = missingvalues.transform(x[:,1:3])

Nota: en la versión reciente, el missing_valuesvalor del parámetro cambia a np.nandeNaN

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.