如何用一组子集的平均值填充NaN?

时间:2019-10-22 17:38:28

标签: python pandas pandas-groupby fillna

我有一个数据帧,其中一些值由yeartype组成。我想用特定类型将该年中的所有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'))

3 个答案:

答案 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)

masktransform

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