Замена пустых значений по условию
Есть DataFrame об опросе уровня счастья в разных странах.
Country happiness_score gdp_per_capita family health freedom generosity government_trust dystopia_residual continent Year social_support cpi_score
0 Norway 7.5370 1.616463 1.533524 0.796667 0.635423 0.362012 0.315964 2.277027 Europe 2015 0.000000 88
1 Denmark 7.5220 1.482383 1.551122 0.792566 0.626007 0.355280 0.400770 2.313707 Europe 2015 0.000000 91
2 Iceland 7.5040 1.480633 1.610574 0.833552 0.627163 0.475540 0.153527 2.322715 Europe 2015 0.000000 79
3 Switzerland 7.4940 1.564980 1.516912 0.858131 0.620071 0.290549 0.367007 2.276716 Europe 2015 0.000000 86
4 Finland NaN 1.443572 1.540247 0.809158 0.797000 0.245483 0.382612 2.430182 Europe 2015 0.000000 90
5 Netherlands 7.3770 1.503945 1.428939 0.810696 0.585384 0.470490 0.282662 2.294804 Europe 2015 0.000000 84
6 Canada 7.3160 1.479204 1.481349 0.834558 0.611101 0.435540 0.287372 2.187264 North America 2015 0.000000 83
7 New Zealand 7.3140 1.405706 1.548195 0.816760 0.614062 0.500005 0.382817 2.046456 Australia 2015 0.000000 91
8 Sweden 7.2840 1.494387 1.478162 0.830875 0.612924 0.385399 0.384399 2.097538 Europe 2015 0.000000 89
9 Australia 7.2840 1.484415 1.510042 0.843887 0.601607 0.477699 0.301184 2.065211 Australia 2015 0.000000 79
10 Israel 7.2130 1.375382 1.376290 0.838404 0.405989 0.330083 0.085242 2.801757 Asia 2015 0.000000 61
Задача состоит в том, чтобы заполнить Nan данные по happiness_score средним значением из уже имеющихся данных для каждой страны. Удалось найти среднее значение по каждой стране, но зашел в тупик.
for_country_avg_1 = df.groupby('Country')['happiness_score'].sum()
for_country_avg_2 = df.groupby('Country').size()
country_avg = for_country_avg_1 / for_country_avg_2
Ответы (1 шт):
Автор решения: strawdog
→ Ссылка
В общем, решение использовать группировку - верное, осталось лишь доработать код. Во-первых, в pandas есть встроенная функция вычисления среднего (mean), во-вторых, есть отличный метод transform, который можно использовать для заполнения nan-значений с помощью аксессора fillna:
df["happiness_score"] = df.groupby("Country")["happiness_score"].transform(lambda x: x.fillna(x.mean()))
df:
Country happiness_score gdp_per_capita family health freedom generosity government_trust dystopia_residual continent Year social_support cpi_score
0 Norway 7.53700 1.616463 1.533524 0.796667 0.635423 0.362012 0.315964 2.277027 Europe 2015 0.000000 88
1 Denmark 7.52200 1.482383 1.551122 0.792566 0.626007 0.355280 0.400770 2.313707 Europe 2015 0.000000 91
2 Iceland 7.50400 1.480633 1.610574 0.833552 0.627163 0.475540 0.153527 2.322715 Europe 2015 0.000000 79
3 Switzerland 7.49400 1.564980 1.516912 0.858131 0.620071 0.290549 0.367007 2.276716 Europe 2015 0.000000 86
4 Finland 7.60574 1.443572 1.540247 0.809158 0.797000 0.245483 0.382612 2.430182 Europe 2015 0.000000 90
. . .
проверяем на примере Финляндии на исходной таблице:
df.loc[df["Country"]=="Finland","happiness_score"].mean()
7.6057400170000005