与groupby和mean结合使用时,Fillna无法正常工作

时间:2019-04-09 13:53:02

标签: python python-3.x pandas dataframe

以下代码将我的数据框过滤为以赞比亚为国家/地区名称的5行。

df2.loc[df2['Country Name'] == 'Zambia'].head(5)

Country Name    Year    CO2
262    Zambia   1960    NaN
526    Zambia   1961    NaN
790    Zambia   1962    NaN
1054   Zambia   1963    NaN
1318   Zambia   1964    0.949422

接下来,下面显示的是赞比亚平均CO2值。

df2.groupby('Country Name', as_index=False)['CO2'].mean().loc[df2['Country Name'] == 'Zambia']

    Country Name    CO2
262   Zambia      0.484002

最后,我现在尝试用平均值填充所有NaN值。请注意,实际上只填写了第一个NaN值。为什么这样做?如何确保每个NaN值都被每个国家/地区的平均值填充了?

df2['CO2'] = df2['CO2'].fillna(value = df2.groupby('Country Name', as_index=False)['CO2'].mean()['CO2'])

    Country Name  Year    CO2
262    Zambia     1960   0.484002
526    Zambia     1961    NaN
790    Zambia     1962    NaN
1054   Zambia     1963    NaN
1318   Zambia     1964   0.949422

1 个答案:

答案 0 :(得分:1)

使用GroupBy.transform来返回Series,该返回值由与原始DataFrame大小相同的聚合值填充,因此fillna运作良好:

s = df2.groupby('Country Name')['CO2'].transform('mean')
df2['CO2'] = df2['CO2'].fillna(value = s)