19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
Библиотека pandas. Продолжение.
Группировка и агрегирование: методы .groupby() и .agg()
Часто случается, что данные необходимо сгруппировать по какому-то признаку ‒ по значениям определенной переменной. На входе имеется таблица (датафрейм), а на выходе хочется получить несколько таблиц: отдельная таблица для каждого значения. Давайте рассмотрим такой пример. У нас есть база данных с результатами выборов, и нам нужно сгруппировать данные по регионам.
Для начала импортируем библиотеку pandas и загрузим файл с данными.
In [1]:
import pandas as pd
Для разнообразия загрузим файл по ссылке с Github (база большая, загрузится не моментально):
In [2]:
df = pd.read_csv("https://raw.github/47130-8314.csv")
В таблице сохранены результаты выборов президента России 2012 года.
In [3]:
df.head()
Out[3]:
|
link |
uik |
kom1 |
kom2 |
kom3 kom4 |
kom |
||
|
|
|
|
|
|
|
|
|
0 |
|
|
Республика |
|
УИК |
|
|
|
http://www.adygei.vybory.izbirkom.ru/region/ad... |
1 |
Адыгея |
Адыгейская |
NaN |
NaN |
|||
№1 |
||||||||
|
|
|
(Адыгея) |
|
|
|
||
|
|
|
|
|
|
|
||
1 |
|
|
Республика |
|
УИК |
|
|
|
http://www.adygei.vybory.izbirkom.ru/region/ad... |
2 |
Адыгея |
Адыгейская |
NaN |
NaN |
|||
№2 |
||||||||
|
|
|
(Адыгея) |
|
|
|
||
|
|
|
|
|
|
|
||
2 |
|
|
Республика |
|
УИК |
|
|
|
http://www.adygei.vybory.izbirkom.ru/region/ad... |
3 |
Адыгея |
Адыгейская |
NaN |
NaN |
|||
№3 |
||||||||
|
|
|
(Адыгея) |
|
|
|
||
|
|
|
|
|
|
|
||
3 |
|
|
Республика |
|
УИК |
|
|
|
http://www.adygei.vybory.izbirkom.ru/region/ad... |
4 |
Адыгея |
Адыгейская |
NaN |
NaN |
|||
№4 |
||||||||
|
|
|
(Адыгея) |
|
|
|
||
|
|
|
|
|
|
|
||
4 |
|
|
Республика |
|
УИК |
|
|
|
http://www.adygei.vybory.izbirkom.ru/region/ad... |
5 |
Адыгея |
Адыгейская |
NaN |
NaN |
|||
№5 |
||||||||
|
|
|
(Адыгея) |
|
|
|
||
|
|
|
|
|
|
|
5 rows × 34 columns
|
|
|
|
|
|
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
1/19 |
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
In [4]:
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 90003 entries, 0 to 90002
Data columns (total 34 |
columns): |
||
link |
90003 |
non-null |
object |
uik |
90003 |
non-null |
int64 |
kom1 |
90003 |
non-null |
object |
kom2 |
90003 |
non-null |
object |
kom3 |
89618 |
non-null |
object |
kom4 |
0 non-null float64 |
||
kom5 |
0 non-null float64 |
||
1 |
89994 |
non-null |
float64 |
2 |
89994 |
non-null |
float64 |
3 |
89994 |
non-null |
float64 |
4 |
89994 |
non-null |
float64 |
5 |
89994 |
non-null |
float64 |
6 |
89994 |
non-null |
float64 |
7 |
89994 |
non-null |
float64 |
8 |
89994 |
non-null |
float64 |
9 |
89994 |
non-null |
float64 |
1089994 non-null float64
1189994 non-null float64
1289994 non-null float64
1389994 non-null float64
1489994 non-null float64
1589994 non-null float64
1689994 non-null float64
1789994 non-null float64
1889994 non-null float64
1989994 non-null float64
2089994 non-null float64
2189994 non-null float64
2289994 non-null float64
2389994 non-null float64 а 0 non-null float64
б 0 non-null float64 в 0 non-null float64 г 0 non-null float64
dtypes: float64(29), int64(1), object(4) memory usage: 23.3+ MB
Таблица достаточно большая, поэтому давайте выберем те столбцы, которые понадобятся нам для работы. Какие именно? Столбцы в этой базе имеют порядковый номер строки в таблице на сайте () Центральной избирательной комиссии.
Выберем столбцы, которые соответствуют уровням комиссий, а также следующим показателям: общее число зарегистрированных избирателей, число недействительных бюллетеней, число действительных бюллетеней, число голосов за Жириновского, Зюганова, Миронова, Прохорова и Путина.
In [5]:
d = df[["kom1", "kom2", "kom3", "1", "9", "10", "19", "20", "21", "22", "23"]]
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
2/19 |
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
In [6]:
d.head()
Out[6]:
|
kom1 |
kom2 |
kom3 |
1 |
9 |
10 |
19 |
20 |
21 |
22 |
23 |
|
|
|
|
|
|
|
|
|
|
|
|
0 |
Республика |
Адыгейская |
УИК |
2383.0 |
19.0 |
1571.0 |
24.0 |
382.0 |
28.0 |
71.0 |
1066.0 |
Адыгея (Адыгея) |
№1 |
||||||||||
1 |
Республика |
Адыгейская |
УИК |
2865.0 |
29.0 |
1831.0 |
51.0 |
453.0 |
49.0 |
104.0 |
1174.0 |
Адыгея (Адыгея) |
№2 |
||||||||||
2 |
Республика |
Адыгейская |
УИК |
2821.0 |
31.0 |
1673.0 |
36.0 |
481.0 |
24.0 |
107.0 |
1025.0 |
Адыгея (Адыгея) |
№3 |
||||||||||
3 |
Республика |
Адыгейская |
УИК |
2069.0 |
0.0 |
1246.0 |
0.0 |
414.0 |
0.0 |
48.0 |
784.0 |
Адыгея (Адыгея) |
№4 |
||||||||||
4 |
Республика |
Адыгейская |
УИК |
777.0 |
8.0 |
454.0 |
19.0 |
138.0 |
4.0 |
7.0 |
286.0 |
Адыгея (Адыгея) |
№5 |
Теперь присвоим столбцам более информативные названия:
In [7]:
d.columns = ["region", "tik", "uik", "total", "invalid", "valid", "Zh", "Zu", "Mi", "Pr", "
In [8]:
d.head() # опять посмотрим
Out[8]:
|
region |
tik |
uik |
total |
invalid |
valid |
Zh |
Zu |
Mi |
Pr |
Pu |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
Республика |
|
УИК |
|
|
|
|
|
|
|
|
|
Адыгея |
Адыгейская |
2383.0 |
19.0 |
1571.0 |
24.0 |
382.0 |
28.0 |
71.0 |
1066.0 |
|||
№1 |
||||||||||||
|
(Адыгея) |
|
|
|
|
|
|
|
|
|
|
|
1 |
Республика |
|
УИК |
|
|
|
|
|
|
|
|
|
Адыгея |
Адыгейская |
2865.0 |
29.0 |
1831.0 |
51.0 |
453.0 |
49.0 |
104.0 |
1174.0 |
|||
№2 |
||||||||||||
|
(Адыгея) |
|
|
|
|
|
|
|
|
|
|
|
2 |
Республика |
|
УИК |
|
|
|
|
|
|
|
|
|
Адыгея |
Адыгейская |
2821.0 |
31.0 |
1673.0 |
36.0 |
481.0 |
24.0 |
107.0 |
1025.0 |
|||
№3 |
||||||||||||
|
(Адыгея) |
|
|
|
|
|
|
|
|
|
|
|
3 |
Республика |
|
УИК |
|
|
|
|
|
|
|
|
|
Адыгея |
Адыгейская |
2069.0 |
0.0 |
1246.0 |
0.0 |
414.0 |
0.0 |
48.0 |
784.0 |
|||
№4 |
||||||||||||
|
(Адыгея) |
|
|
|
|
|
|
|
|
|
|
|
4 |
Республика |
|
УИК |
|
|
|
|
|
|
|
|
|
Адыгея |
Адыгейская |
777.0 |
8.0 |
454.0 |
19.0 |
138.0 |
4.0 |
7.0 |
286.0 |
|||
№5 |
||||||||||||
|
(Адыгея) |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
Посмотрим теперь, какие регионы есть в базе. Выбрать столбец region в таком случае будет не совсем удачно, поскольку в нем будет много повторяющихся значенийй. Посмотрим только на уникальные:
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
3/19 |
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
In [9]:
d.region.unique() # метод unique - уникальные значения
Out[9]:
array(['Республика Адыгея (Адыгея)', 'Республика Алтай', 'Республика Башкортостан', 'Республика Бурятия', 'Республика Дагестан', 'Республика Дагестан', 'Республика Ингушетия', 'Кабардино-Балкарская Республика',
'Республика Калмыкия', 'Карачаево-Черкесская Республика', 'Республика Карелия', 'Республика Коми', 'Республика Марий Эл', 'Республика Мордовия', 'Республика Саха (Якутия)', 'Республика Северная Осетия - Алания', 'Республика Тыва', 'Удмуртская Республика', 'Республика Хакасия', 'Чувашская Республика - Чувашия', 'Алтайский край',
'Забайкальский край', 'Камчатский край', 'Краснодарский край', 'Красноярский край', 'Пермский край', 'Приморский край', 'Ставропольский край', 'Хабаровский край', 'Хабаровский край', 'Амурская область', 'Архангельская область', 'Астраханская область', 'Белгородская область', 'Брянская область', 'Владимирская область', 'Волгоградская область',
'Вологодская область', 'Воронежская область', 'Ивановская область', 'Иркутская область', 'Калужская область', 'Кемеровская область', 'Кировская область', 'Костромская область', 'Курганская область', 'Курская область', 'Ленинградская область', 'Липецкая область', 'Магаданская область', 'Московская область', 'Мурманская область', 'Мурманская область', 'Нижегородская область', 'Новгородская область', 'Новосибирская область', 'Омская область',
'Оренбургская область', 'Орловская область', 'Пензенская область', 'Псковская область', 'Ростовская область', 'Рязанская область', 'Самарская область', 'Саратовская область', 'Сахалинская область', 'Свердловская область', 'Смоленская область', 'Тамбовская область', 'Тверская область', 'Томская область', 'Тульская область', 'Тюменская область', 'Ульяновская область', 'Челябинская область', 'Город Москва', 'Город Санкт-Петербург', 'Город Санкт-Петербург', 'Еврейская автономная область', 'Ненецкий автономный округ', 'Чукотский автономный округ', 'Ямало-Ненецкий автономный округ', 'Город Байконур (Республика Казахстан)',
'Территория за пределами РФ'], dtype=object)
Видно, что в этом массиве встречаются какие-то крокозябры (названия со странной кодировкой). Давайте уберем эти строки из базы.
In [10]:
# отфильтруем с помощью условий
d = d[(d.region != 'Республика Дагестан') & (d.region != 'Хабаровский край') &
(d.region != 'Мурманская область') & (d.region != 'Город Санкт-Петербург')]
Сгруппируем данные по регионам и посчитаем для каждого региона явку в процентах и процент голосов за каждого кандидата. Группировка осуществляется с помощью метода .groupby() .
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
4/19 |
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
In [11]:
d.groupby('region') # пока ничего не увидели
Out[11]:
<pandas.core.groupby.DataFrameGroupBy object at 0x7ffb59de38d0>
Что выдает метод .groupby() ? На самом деле он делает следующее: создает список, состоящий из кортежей. Каждый кортеж ‒ это пара название группы-соответствующий ей фрагмент датафрейма.
In [ ]:
# посмотрим на все сразу
for g in d.groupby('region'): print(g)
В таком виде метод .groupby() дает нам немного. Мы же хотим не просто получать отдельные таблицы, а агрегировать данные по регионам ‒ суммировать все показатели (число избирателей, бюллетеней, голосов) по каждому региону. Тут на помощь придет метод .agg() , который выполняет агрегирование по группам.
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
5/19 |
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
In [12]:
d.groupby('region').agg('sum')
Out[12]:
total invalid |
valid |
Zh |
Zu |
Mi |
Pr |
region
Алтайский край
Амурская
область
Архангельская
область
Астраханская
область
Белгородская
область
Брянская
область
Владимирская
область
Волгоградская
область
Вологодская
область
Воронежская
область
Город Байконур (Республика Казахстан)
Город Москва
Город СанктПетербург
Еврейская
автономная
область
Забайкальский
край
Ивановская
область
Иркутская
область
КабардиноБалкарская Республика
Калужская
область
Камчатский
край
КарачаевоЧеркесская Республика
1961328.0 |
12004.0 |
1163426.0 |
97961.0 |
261665.0 |
45883.0 |
83778.0 |
6741 |
662320.0 |
4708.0 |
394996.0 |
39717.0 |
67433.0 |
13594.0 |
23070.0 |
2511 |
988678.0 |
5522.0 |
569492.0 |
51169.0 |
91648.0 |
33223.0 |
60108.0 |
3333 |
769608.0 |
5107.0 |
427496.0 |
21918.0 |
67662.0 |
18595.0 |
21873.0 |
2974 |
1210590.0 |
10209.0 |
889764.0 |
59561.0 |
211079.0 |
35601.0 |
49807.0 |
5337 |
1045083.0 |
6922.0 |
692926.0 |
42974.0 |
146340.0 |
23453.0 |
32141.0 |
4480 |
1202174.0 |
8484.0 |
629526.0 |
53615.0 |
132400.0 |
41895.0 |
60315.0 |
3413 |
2003455.0 |
12696.0 |
1265720.0 |
87657.0 |
240998.0 |
55325.0 |
71142.0 |
8105 |
987574.0 |
6596.0 |
601999.0 |
49492.0 |
93417.0 |
40306.0 |
57064.0 |
3617 |
1918524.0 |
13073.0 |
1291271.0 |
81081.0 |
292379.0 |
47974.0 |
69813.0 |
8000 |
15116.0 |
185.0 |
10422.0 |
586.0 |
1288.0 |
317.0 |
722.0 |
75 |
7309869.0 |
87698.0 |
4159740.0 |
267418.0 |
814573.0 |
214703.0 |
868736.0 |
19943 |
3849426.0 |
33331.0 |
2355236.0 |
110979.0 |
311937.0 |
157768.0 |
370799.0 |
14037 |
135703.0 |
1208.0 |
78205.0 |
6632.0 |
14796.0 |
2763.0 |
5102.0 |
489 |
831712.0 |
5271.0 |
493136.0 |
49612.0 |
71636.0 |
15015.0 |
29466.0 |
3274 |
866474.0 |
5338.0 |
513901.0 |
37650.0 |
95005.0 |
23060.0 |
37016.0 |
3211 |
1915179.0 |
12186.0 |
1060537.0 |
88419.0 |
242097.0 |
41152.0 |
94008.0 |
5948 |
528147.0 |
418.0 |
385368.0 |
11888.0 |
53261.0 |
11753.0 |
8937.0 |
2995 |
798196.0 |
6327.0 |
500606.0 |
37634.0 |
101459.0 |
21427.0 |
40911.0 |
2991 |
256522.0 |
1951.0 |
154696.0 |
16504.0 |
25009.0 |
5430.0 |
14015.0 |
937 |
319473.0 |
631.0 |
290989.0 |
2851.0 |
16937.0 |
2162.0 |
2629.0 |
2664 |
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
6/19 |
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
||||
total invalid |
valid |
Zh |
Zu |
Mi |
Pr |
region |
|
|
|
|
|
Кемеровская
область
Кировская
область
Костромская
область
Краснодарский
край
Красноярский
край
Курганская
область
Курская область
Ленинградская
область
Липецкая
область
...
Республика
Калмыкия
Республика
Карелия
Республика
Коми
Республика Марий Эл
Республика
Мордовия
Республика Саха (Якутия)
Республика
Северная Осетия - Алания
Республика
Тыва
Республика
Хакасия
Ростовская
область
Рязанская
область
Самарская
область
Саратовская
область
Сахалинская
область
Свердловская
область
2076673.0 |
16002.0 |
1626578.0 |
112067.0 |
133705.0 |
37450.0 |
75519.0 |
12678 |
1125794.0 |
7864.0 |
682321.0 |
54531.0 |
127982.0 |
36005.0 |
63993.0 |
3998 |
567472.0 |
3076.0 |
345513.0 |
28204.0 |
90714.0 |
16094.0 |
26517.0 |
1839 |
3803307.0 |
32893.0 |
2659197.0 |
176119.0 |
496909.0 |
88976.0 |
181844.0 |
17153 |
2192321.0 |
16279.0 |
1287567.0 |
112222.0 |
235058.0 |
46123.0 |
109827.0 |
7843 |
751903.0 |
4314.0 |
478077.0 |
41340.0 |
83955.0 |
19280.0 |
27725.0 |
3057 |
947765.0 |
6350.0 |
600367.0 |
49744.0 |
122775.0 |
23101.0 |
38002.0 |
3667 |
1281947.0 |
10664.0 |
800093.0 |
54857.0 |
114951.0 |
47518.0 |
80874.0 |
5018 |
954695.0 |
7751.0 |
618784.0 |
44697.0 |
132408.0 |
24722.0 |
34778.0 |
3821 |
... |
... |
... |
... |
... |
... |
... |
|
214497.0 |
1242.0 |
131760.0 |
3374.0 |
23295.0 |
3562.0 |
8029.0 |
935 |
558774.0 |
3839.0 |
305600.0 |
26579.0 |
50957.0 |
18886.0 |
37798.0 |
1713 |
750661.0 |
6970.0 |
518810.0 |
40314.0 |
70135.0 |
22738.0 |
43759.0 |
3418 |
537932.0 |
3984.0 |
377164.0 |
24895.0 |
84200.0 |
15175.0 |
24282.0 |
2286 |
649355.0 |
3796.0 |
577911.0 |
13635.0 |
42060.0 |
6448.0 |
9353.0 |
5064 |
614351.0 |
3978.0 |
453719.0 |
20010.0 |
65871.0 |
20193.0 |
29712.0 |
3179 |
512245.0 |
3995.0 |
409435.0 |
13063.0 |
87017.0 |
12864.0 |
6848.0 |
2896 |
159341.0 |
860.0 |
146720.0 |
2574.0 |
6370.0 |
2023.0 |
2925.0 |
1328 |
382578.0 |
2819.0 |
244660.0 |
20991.0 |
50872.0 |
8878.0 |
19400.0 |
1445 |
3315673.0 |
21742.0 |
2091438.0 |
132418.0 |
423884.0 |
76633.0 |
134461.0 |
13240 |
967998.0 |
6508.0 |
614459.0 |
47068.0 |
132981.0 |
25562.0 |
37903.0 |
3709 |
2562916.0 |
20828.0 |
1536839.0 |
117828.0 |
320128.0 |
61361.0 |
125423.0 |
9120 |
1991376.0 |
12400.0 |
1310761.0 |
66985.0 |
206818.0 |
43267.0 |
59006.0 |
9346 |
398893.0 |
2846.0 |
225504.0 |
20016.0 |
45730.0 |
8856.0 |
22337.0 |
1285 |
3527808.0 |
25560.0 |
2048423.0 |
107819.0 |
251690.0 |
113353.0 |
237780.0 |
13377 |
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
7/19 |
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
||||
total invalid |
valid |
Zh |
Zu |
Mi |
Pr |
region |
|
|
|
|
|
Смоленская
область
Ставропольский
край
Тамбовская
область
Тверская
область
Территория за пределами РФ
Томская
область
Тульская
область
Тюменская
область
Удмуртская
Республика
Ульяновская
область
Хабаровский
край
Челябинская
область
Чувашская Республика - Чувашия
Чукотский
автономный
округ
ЯмалоНенецкий автономный округ
816276.0 |
5843.0 |
476106.0 |
38246.0 |
111182.0 |
20930.0 |
32516.0 |
2732 |
1983954.0 |
12448.0 |
1183292.0 |
83543.0 |
215600.0 |
37551.0 |
75724.0 |
7708 |
884888.0 |
5570.0 |
614521.0 |
28179.0 |
107797.0 |
13973.0 |
19594.0 |
4449 |
1137087.0 |
7076.0 |
660420.0 |
49384.0 |
131591.0 |
32835.0 |
59302.0 |
3873 |
459661.0 |
5838.0 |
436093.0 |
12006.0 |
31785.0 |
8674.0 |
59942.0 |
3236 |
787075.0 |
5194.0 |
453117.0 |
35139.0 |
86403.0 |
16966.0 |
53028.0 |
2615 |
1249121.0 |
8862.0 |
858707.0 |
50218.0 |
147019.0 |
29601.0 |
43917.0 |
5879 |
1056505.0 |
6915.0 |
829264.0 |
59083.0 |
95398.0 |
20455.0 |
43047.0 |
6112 |
1218251.0 |
9048.0 |
775357.0 |
49160.0 |
116277.0 |
26803.0 |
67362.0 |
5157 |
1048667.0 |
6926.0 |
659233.0 |
46384.0 |
160089.0 |
27783.0 |
37437.0 |
3875 |
1056125.0 |
8733.0 |
645264.0 |
68500.0 |
115436.0 |
31944.0 |
62145.0 |
3672 |
2757879.0 |
25366.0 |
1704033.0 |
97869.0 |
254542.0 |
88177.0 |
138907.0 |
11245 |
954572.0 |
10465.0 |
692492.0 |
39707.0 |
144676.0 |
31201.0 |
38838.0 |
4380 |
35968.0 |
428.0 |
28909.0 |
2106.0 |
2651.0 |
633.0 |
2209.0 |
213 |
358834.0 |
2669.0 |
332293.0 |
17456.0 |
18738.0 |
4979.0 |
7807.0 |
2833 |
80 rows × 8 columns
Сначала в .groupby() мы указали переменную, по которой нужно выполнить группировку, затем в
.agg() мы указали функцию, которую нужно выполнить. В нашем случае это 'sum', поскольку нам нужно просто сложить все показатели в пределах одного региона. Применять можно и другие функции, например, считать среднее:
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
8/19 |
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
In [16]:
d.groupby('region').agg('mean').head() # mean - среднее
Out[16]:
|
|
|
total |
invalid |
valid |
Zh |
Zu |
|
Mi |
P |
|
|
region |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Алтайский |
1053.344791 |
6.446831 |
624.825994 |
52.610634 |
140.529001 |
24.641783 |
44.99355 |
|
|
|
край |
|
|
|
|
|
|
|
|
|
|
Амурская |
845.874840 |
6.012771 |
504.464879 |
50.724138 |
86.121328 |
17.361430 |
29.46360 |
|
|
|
область |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
Архангельская |
1004.754065 |
5.611789 |
578.752033 |
52.001016 |
93.138211 |
33.763211 |
61.08536 |
||
|
|
область |
|
|
|
|
|
|
|
|
|
Астраханская |
1313.324232 |
8.715017 |
729.515358 |
37.402730 |
115.464164 |
31.732082 |
37.32593 |
||
|
|
область |
|
|
|
|
|
|
|
|
|
Белгородская |
968.472000 |
8.167200 |
711.811200 |
47.648800 |
168.863200 |
28.480800 |
39.84560 |
||
|
|
область |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Или сразу несколько статистик. которые можно указать в .agg() в виде списка.
In [17]:
d.groupby('region').agg(['mean', 'median']).head() # среднее и медиана
Out[17]:
|
|
|
|
total |
|
invalid |
|
valid |
|
Z |
|
|
|
|
mean |
median |
mean |
median |
mean |
median |
mean |
media |
|
|
|
region |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Алтайский |
1053.344791 |
823.0 |
6.446831 |
4.0 |
624.825994 |
495.0 |
52.610634 |
41 |
|
|
|
край |
|
|
|
|
|
|
|
|
|
|
|
Амурская |
845.874840 |
523.0 |
6.012771 |
4.0 |
504.464879 |
326.0 |
50.724138 |
31 |
|
|
|
область |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Архангельская |
1004.754065 |
581.5 |
5.611789 |
2.0 |
578.752033 |
332.5 |
52.001016 |
29 |
||
|
|
область |
|
|
|
|
|
|
|
|
|
|
Астраханская |
1313.324232 |
1283.5 |
8.715017 |
6.0 |
729.515358 |
692.5 |
37.402730 |
31 |
||
|
|
область |
|
|
|
|
|
|
|
|
|
|
Белгородская |
968.472000 |
802.0 |
8.167200 |
6.0 |
711.811200 |
633.0 |
47.648800 |
41 |
||
|
|
область |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Кроме того, внутри .agg() можно указывать свои функции. Например, нас интересует разница между максимальным и минимальным значением. Сначала напишем функцию my_diff , которая будет определять такую разность:
In [18]:
def my_diff(x):
return max(x) - min(x)
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
9/19 |
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
Проверим, как она работает:
In [19]:
my_diff([4, 6, 8]) # все верно, 8 - 4 = 4
Out[19]:
4
Теперь используем эту функцию внутри .agg() :
In [20]:
d.groupby('region').agg(my_diff).head() # везде смотрим на первые 5 строк
Out[20]:
|
total |
invalid |
valid |
Zh |
Zu |
Mi |
Pr |
Pu |
region |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Алтайский край |
3030.0 |
72.0 |
2389.0 |
379.0 |
573.0 |
131.0 |
351.0 |
1639.0 |
Амурская область |
2942.0 |
130.0 |
1773.0 |
267.0 |
404.0 |
92.0 |
197.0 |
1201.0 |
Архангельская область |
2953.0 |
76.0 |
1951.0 |
232.0 |
407.0 |
153.0 |
369.0 |
1205.0 |
Астраханская область |
2936.0 |
223.0 |
1862.0 |
209.0 |
411.0 |
157.0 |
234.0 |
1367.0 |
Белгородская область |
2998.0 |
71.0 |
2118.0 |
234.0 |
612.0 |
108.0 |
335.0 |
1268.0 |
Возможностей на самом деле у метода .agg() много, но давайте более продвинутые вещи оставим на потом (будет выложен отдельный конспект с дополнительными материалами).
Все, что мы пока сделали, очень интересно, но есть проблема: все данные пока даны в абсолютных значениях, не в процентах. Это неудобно. Давайте сгруппируем данные по региону и добавим в базу с агрегированными данными новые столбцы: явка в процентах и проценты голосов за каждого кандидата.
Для этого необходимо вспомнить, как считается явка и проценты голосов. Явка считается так: суммируем число действительных и недействительных бюллетеней. Чтобы получить явку в процентах, делим явку на общее число зарегистрированных избирателей и домножаем на 100, чтобы перевести долю в проценты. Проценты голосов за кандидатов считаем от явки, берем число голосов за кандидата, делим на явку и домножаем на 100. Проделаем это поэтапно.
Сначала сохраним результат агрегирования в переменную regs и добавим новый столбец для явки в абсолютных значениях (в голосах).
In [21]:
regs = d.groupby('region').agg('sum')
regs["turnout"] = regs.invalid + regs.valid # новый столбец - сумма двух старых
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
10/19 |