Llenar los valores faltantes por media en cada grupo
Esto debería ser sencillo, pero lo más parecido que he encontrado es esta publicación: pandas: Llenar valores faltantes dentro de un grupo , y todavía no puedo resolver mi problema...
Supongamos que tengo el siguiente marco de datos
df = pd.DataFrame({'value': [1, np.nan, np.nan, 2, 3, 1, 3, np.nan, 3], 'name': ['A','A', 'B','B','B','B', 'C','C','C']})
name value
0 A 1
1 A NaN
2 B NaN
3 B 2
4 B 3
5 B 1
6 C 3
7 C NaN
8 C 3
y me gustaría completar "NaN" con el valor medio en cada grupo de "nombre", es decir
name value
0 A 1
1 A 1
2 B 2
3 B 2
4 B 3
5 B 1
6 C 3
7 C 3
8 C 3
No estoy seguro de adónde ir después:
grouped = df.groupby('name').mean()
Aceptado
Una forma sería utilizar transform
:
>>> df
name value
0 A 1
1 A NaN
2 B NaN
3 B 2
4 B 3
5 B 1
6 C 3
7 C NaN
8 C 3
>>> df["value"] = df.groupby("name").transform(lambda x: x.fillna(x.mean()))
>>> df
name value
0 A 1
1 A 1
2 B 2
3 B 2
4 B 3
5 B 1
6 C 3
7 C 3
8 C 3
fillna
+ groupby
+ transform
+mean
Esto parece intuitivo:
df['value'] = df['value'].fillna(df.groupby('name')['value'].transform('mean'))
La sintaxis groupby
+ transform
asigna la media grupal al índice del marco de datos original. Esto es más o menos equivalente a la solución de @DSM , pero evita la necesidad de definir una lambda
función anónima.