私はデータセットを持っていますが、次のようないくつかの欠測データがあります:
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になります。私がやりたいのは、カテゴリA
やB
のように、複数の値を持つ場合に、ヌルをそのカテゴリの平均に置き換えることです。また、カテゴリ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
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
の値をグループごとの平均で埋めることもできます。この方法は、非効率的なapply
+ lambda
を回避します。例えば:
df['value'] = df['value'].fillna(df.groupby('category')['value'].transform('mean'))
df['value'] = df['value'].fillna(df['value'].mean())