Tengo un marco de datos que contiene valores nan en algunos lugares. Estoy tratando de realizar una limpieza de datos en la que completo los valores nan con la media de sus cinco instancias anteriores. Para ello, he llegado a lo siguiente.
input_data_frame[var_list].fillna(input_data_frame[var_list].rolling(5).mean(), inplace=True)Pero esto no está funcionando. No está llenando los valores nan. No hay cambios en el recuento nulo del marco de datos antes y después de la operación anterior. Suponiendo que tengo un marco de datos con solo una columna de enteros, ¿cómo puedo completar los valores de NaN con la media de las cinco instancias anteriores? Gracias por adelantado.
Esto debería funcionar:
input_data_frame[var_list]= input_data_frame[var_list].fillna(pd.rolling_mean(input_data_frame[var_list], 6, min_periods=1)) Tenga en cuenta que la window es 6 porque incluye el valor de NaN en sí (que no se cuenta en el promedio). Además, los otros valores de NaN no se utilizan para los promedios, por lo que si se encuentran menos de 5 valores en la ventana, el promedio se calcula sobre los valores reales.
Ejemplo:
df = {'a': [1, 1,2,3,4,5, np.nan, 1, 1, 2, 3, 4, 5, np.nan] } df = pd.DataFrame(data=df) print df a 0 1.0 1 1.0 2 2.0 3 3.0 4 4.0 5 5.0 6 NaN 7 1.0 8 1.0 9 2.0 10 3.0 11 4.0 12 5.0 13 NaNProducción:
a 0 1.0 1 1.0 2 2.0 3 3.0 4 4.0 5 5.0 6 3.0 7 1.0 8 1.0 9 2.0 10 3.0 11 4.0 12 5.0 13 3.0La función rolling_mean se ha modificado en pandas. Si llena todo el conjunto de datos, puede usar;
filled_dataset = dataset.fillna(dataset.rolling(6,min_periods=1).mean())simplemente puede usar interpolar ()
df = {'a': [1,5, np.nan, np.nan, np.nan, 2, 5, np.nan] } df = pd.DataFrame(data=df) print(df) df['a'].interpolate()