Pandas: ¿Cómo llenar valores nulos con la media de un groupby?

Tengo un conjunto de datos que faltan algunos datos que se parecen a esto:

id category value 1 A NaN 2 B NaN 3 A 10.5 4 C NaN 5 A 2.0 6 B 1.0 

Necesito completar los nulos para usar los datos en un modelo. Cada vez que se produce una categoría por primera vez es NULL. Lo que quiero hacer es en casos como la categoría A y B que tienen más de un valor, reemplazar los nulos con el promedio de esa categoría. Y para la categoría C con una sola ocurrencia, solo complete el promedio del rest de los datos.

Sé que puedo hacer esto simplemente para casos como C para obtener el promedio de todas las filas, pero estoy atascado intentando hacer los medios por categorías para A y B y reemplazar los valores nulos.

 df['value'] = df['value'].fillna(df['value'].mean()) 

Necesito que la df final sea así.

 id category value 1 A 6.25 2 B 1.0 3 A 10.5 4 C 4.15 5 A 2.0 6 B 1.0 

Creo que puedes usar groupby y apply fillna con mean . Luego obtenga NaN si alguna categoría tiene solo valores de NaN , así que use la mean de todos los valores de la columna para llenar NaN :

 df.value = df.groupby('category')['value'].apply(lambda x: x.fillna(x.mean())) df.value = df.value.fillna(df.value.mean()) print (df) id category value 0 1 A 6.25 1 2 B 1.00 2 3 A 10.50 3 4 C 4.15 4 5 A 2.00 5 6 B 1.00 

También puede usar la transform GroupBy + para rellenar los valores de NaN con medios grupales. Este método evita la apply ineficiente + lambda . Por ejemplo:

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