web-dev-qa-db-ja.com

パンダ:null値を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を入力する必要があります。カテゴリが初めて発生するたびに、それはNULLになります。私がやりたいのは、カテゴリABのように、複数の値を持つ場合に、ヌルをそのカテゴリの平均に置き換えることです。また、カテゴリCの場合、オカレンスが1つしかない場合は、残りのデータの平均を入力するだけです。

Cのような場合にこれを簡単に実行してすべての行の平均を取得できることはわかっていますが、AとBのカテゴリごとの平均を実行しようとして、nullを置き換えることに固執しています。

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
9
sfactor

groupby およびapplyfillnamean を使用できると思います。次に、一部のカテゴリに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
8
jezrael

GroupBy + transformを使用して、NaNの値をグループごとの平均で埋めることもできます。この方法は、非効率的なapply + lambdaを回避します。例えば:

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