Llenar los valores faltantes por media en cada grupo

Resuelto BlueFeet asked hace 11 años • 0 respuestas

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()
BlueFeet avatar Nov 14 '13 05:11 BlueFeet
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
DSM avatar Nov 13 '2013 22:11 DSM

fillna+ groupby+ transform+mean

Esto parece intuitivo:

df['value'] = df['value'].fillna(df.groupby('name')['value'].transform('mean'))

La sintaxis groupby+ transformasigna 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 lambdafunción anónima.

jpp avatar Nov 16 '2018 13:11 jpp