我有一个数据帧,其中一些值由year
和type
组成。我想用特定类型将该年中的所有NaN值替换为该年中的均值。我想以最优雅的方式做到这一点。我正在处理大量数据,因此减少计算量也是很好的。
示例:
df =pd.DataFrame({'year':[1,1,1,2,2,2],
'type':[1,1,2,1,1,2],
'val':[np.nan,5,10,100,200,np.nan]})
我希望将所有类型的所有nan替换为所有类型1的相应年份平均值。
在此示例中,第一行NaN应该替换为5
,最后一行应该替换为150。
这只会填写类型1缺少的值,而不是类型2
df[val]=df[val].fillna(df.query('type==1').groupby('year')[val].transform('mean'))
答案 0 :(得分:1)
您要map
:
# calculate mean val of type 1 by year
s = df[df['type'].eq(1)].groupby('year')['val'].mean()
# replace `year` by the above mean, and fill in the Nan
df['val'] = df['val'].fillna(df['year'].map(s))
输出:
year type val
0 1 1 5.0
1 1 1 5.0
2 1 2 10.0
3 2 1 100.0
4 2 1 200.0
5 2 2 150.0
答案 1 :(得分:1)
使用fillna
和匹配的索引
df['val'] = (df.set_index('year').val
.fillna(df.query('type == 1').groupby(['year']).val.mean())
.values)
year type val
0 1 1 5.0
1 1 1 5.0
2 1 2 10.0
3 2 1 100.0
4 2 1 200.0
5 2 2 150.0
答案 2 :(得分:1)
mask
和transform
df.fillna({'val': df.val.mask(df.type.ne(1)).groupby(df.year).transform('mean')})
year type val
0 1 1 5.0
1 1 1 5.0
2 1 2 10.0
3 2 1 100.0
4 2 1 200.0
5 2 2 150.0