#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)