Pandas: как заполнить нулевые значения средним значением groupby?

у меня есть набор данных недостающие данные, что выглядит так:

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

мне нужно заполнить нули, чтобы использовать данные в модели. Каждый раз, когда категория возникает в первый раз, она равна NULL. То, что я хочу сделать, это для таких случаев, как category A и B которые имеют более одного значения, заменяют нули средним значением этой категории. И для категории C только с одним вхождением просто заполните среднее значение остальных данных.

Я знаю что я могу просто сделать это для таких случаев, как C чтобы получить среднее значение всех строк, но я застрял, пытаясь сделать categorywise средства для A и B и замены нулей.

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

мне нужно, чтобы окончательный df был таким

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

2 ответов


Я думаю, вы можете использовать groupby и apply fillna С mean. Тогда вам NaN если какая-то категория имеет только NaN значения, поэтому использовать mean всех значений столбца для заполнения 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

вы также можете использовать GroupBy + transform заполнить NaN значения со средствами groupwise. Этот метод позволяет избежать неэффективного apply + lambda. Например:

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