我有以下数据框:
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
填充' Vals'的条件均值。基于“Cat'列,即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)
答案 0 :(得分:4)
我们希望"关联"缺少NaN位置的Cat
值。
在Pandas中,这种关联总是通过索引完成的。
因此,将Cat
设置为索引是很自然的:
df = df.set_index(['Cat'])
完成后,fillna
按预期工作:
df['Vals'] = df['Vals'].fillna(means)
要将Cat
返回到某列,您当然可以使用reset_index
:
df = df.reset_index()
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'Cat' : ['A', 'A', 'A','B', 'B', 'A', 'B'],
'Vals' : [1, 2, 3, 4, 5, np.nan, np.nan]})
means = df.groupby(['Cat'])['Vals'].mean()
df = df.set_index(['Cat'])
df['Vals'] = df['Vals'].fillna(means)
df = df.reset_index()
print(df)
产量
Cat Vals
0 A 1.0
1 A 2.0
2 A 3.0
3 B 4.0
4 B 5.0
5 A 2.0
6 B 4.5