Fillna не работает в сочетании с groupby и mean

#python #python-3.x #pandas #dataframe

#python #python-3.x #панды #фрейм данных

Вопрос:

Приведенный ниже код фильтрует мой фрейм данных для 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. Вы пробовали добавлять необязательный аргумент inplace=True к вызову fillna ? pandas.pydata.org/pandas-docs/stable/reference/api /…

Ответ №1:

Используется GroupBy.transform для возврата Series , заполненного совокупными значениями того же размера, что и оригинал DataFrame , поэтому fillna работает хорошо:

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