我有以下数据框:
import numpy as np
import pandas as pd
df = pd.DataFrame(data={'Cat' : ['A', 'A', 'A','B', 'B', 'A', 'B'],
'Vals' : [1, 2, 3, 4, 5, np.nan, np.nan]})
Cat Vals
0 A 1
1 A 2
2 A 3
3 B 4
4 B 5
5 A NaN
6 B NaN
我希望索引5
和6
填充基于“Cat”列的“Vals”的条件均值,分别为2
和4.5
以下代码可正常工作:
means = df.groupby('Cat').Vals.mean()
for i in df[df.Vals.isnull()].index:
df.loc[i, 'Vals'] = means[df.loc[i].Cat]
Cat Vals
0 A 1
1 A 2
2 A 3
3 B 4
4 B 5
5 A 2
6 B 4.5
但我正在寻找更好的东西,比如
df.Vals.fillna(df.Vals.mean(Conditionally to column 'Cat'))
编辑:我找到了这个,它比之前的短一行,但我还是不满意:
means = df.groupby('Cat').Vals.mean()
df.Vals = df.apply(lambda x: means[x.Cat] if pd.isnull(x.Vals) else x.Vals, axis=1)
df["Vals"].fillna(df.groupby("Cat")["Vals"].transform("mean"))
可以避免需要改变索引的必要。它的意思是使用每个类别中"Vals"列的平均值填充该类别中缺失的值,而无需更改数据的索引。 - DSMCat
设置为索引?似乎 df['Vals'] = df['Vals'].fillna(means) 可以在不设置和重置索引的情况下产生相同的结果。 - Joe T. Boka