{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Библиотека pandas. Продолжение." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Группировка и агрегирование: методы `.groupby()` и `.agg()`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Часто случается, что данные необходимо сгруппировать по какому-то признаку ‒ по значениям определенной переменной. На входе имеется таблица (датафрейм), а на выходе хочется получить несколько таблиц: отдельная таблица для каждого значения. Давайте рассмотрим такой пример. У нас есть база данных с результатами выборов, и нам нужно сгруппировать данные по регионам. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для начала импортируем библиотеку pandas и загрузим файл с данными." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для разнообразия загрузим файл по ссылке с Github (база большая, загрузится не моментально):" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv(\"https://raw.githubusercontent.com/allatambov/R-programming-3/master/lectures/lect7-12-01/47130-8314.csv\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В таблице сохранены результаты выборов президента России 2012 года. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
linkuikkom1kom2kom3kom4kom5123...181920212223абвг
0http://www.adygei.vybory.izbirkom.ru/region/ad...1Республика Адыгея (Адыгея)АдыгейскаяУИК №1NaNNaN2383.02147.00.0...0.024.0382.028.071.01066.0NaNNaNNaNNaN
1http://www.adygei.vybory.izbirkom.ru/region/ad...2Республика Адыгея (Адыгея)АдыгейскаяУИК №2NaNNaN2865.02586.00.0...0.051.0453.049.0104.01174.0NaNNaNNaNNaN
2http://www.adygei.vybory.izbirkom.ru/region/ad...3Республика Адыгея (Адыгея)АдыгейскаяУИК №3NaNNaN2821.02558.00.0...0.036.0481.024.0107.01025.0NaNNaNNaNNaN
3http://www.adygei.vybory.izbirkom.ru/region/ad...4Республика Адыгея (Адыгея)АдыгейскаяУИК №4NaNNaN2069.01868.00.0...0.00.0414.00.048.0784.0NaNNaNNaNNaN
4http://www.adygei.vybory.izbirkom.ru/region/ad...5Республика Адыгея (Адыгея)АдыгейскаяУИК №5NaNNaN777.0705.00.0...0.019.0138.04.07.0286.0NaNNaNNaNNaN
\n", "

5 rows × 34 columns

\n", "
" ], "text/plain": [ " link uik \\\n", "0 http://www.adygei.vybory.izbirkom.ru/region/ad... 1 \n", "1 http://www.adygei.vybory.izbirkom.ru/region/ad... 2 \n", "2 http://www.adygei.vybory.izbirkom.ru/region/ad... 3 \n", "3 http://www.adygei.vybory.izbirkom.ru/region/ad... 4 \n", "4 http://www.adygei.vybory.izbirkom.ru/region/ad... 5 \n", "\n", " kom1 kom2 kom3 kom4 kom5 1 2 \\\n", "0 Республика Адыгея (Адыгея) Адыгейская УИК №1 NaN NaN 2383.0 2147.0 \n", "1 Республика Адыгея (Адыгея) Адыгейская УИК №2 NaN NaN 2865.0 2586.0 \n", "2 Республика Адыгея (Адыгея) Адыгейская УИК №3 NaN NaN 2821.0 2558.0 \n", "3 Республика Адыгея (Адыгея) Адыгейская УИК №4 NaN NaN 2069.0 1868.0 \n", "4 Республика Адыгея (Адыгея) Адыгейская УИК №5 NaN NaN 777.0 705.0 \n", "\n", " 3 ... 18 19 20 21 22 23 а б в г \n", "0 0.0 ... 0.0 24.0 382.0 28.0 71.0 1066.0 NaN NaN NaN NaN \n", "1 0.0 ... 0.0 51.0 453.0 49.0 104.0 1174.0 NaN NaN NaN NaN \n", "2 0.0 ... 0.0 36.0 481.0 24.0 107.0 1025.0 NaN NaN NaN NaN \n", "3 0.0 ... 0.0 0.0 414.0 0.0 48.0 784.0 NaN NaN NaN NaN \n", "4 0.0 ... 0.0 19.0 138.0 4.0 7.0 286.0 NaN NaN NaN NaN \n", "\n", "[5 rows x 34 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 90003 entries, 0 to 90002\n", "Data columns (total 34 columns):\n", "link 90003 non-null object\n", "uik 90003 non-null int64\n", "kom1 90003 non-null object\n", "kom2 90003 non-null object\n", "kom3 89618 non-null object\n", "kom4 0 non-null float64\n", "kom5 0 non-null float64\n", "1 89994 non-null float64\n", "2 89994 non-null float64\n", "3 89994 non-null float64\n", "4 89994 non-null float64\n", "5 89994 non-null float64\n", "6 89994 non-null float64\n", "7 89994 non-null float64\n", "8 89994 non-null float64\n", "9 89994 non-null float64\n", "10 89994 non-null float64\n", "11 89994 non-null float64\n", "12 89994 non-null float64\n", "13 89994 non-null float64\n", "14 89994 non-null float64\n", "15 89994 non-null float64\n", "16 89994 non-null float64\n", "17 89994 non-null float64\n", "18 89994 non-null float64\n", "19 89994 non-null float64\n", "20 89994 non-null float64\n", "21 89994 non-null float64\n", "22 89994 non-null float64\n", "23 89994 non-null float64\n", "а 0 non-null float64\n", "б 0 non-null float64\n", "в 0 non-null float64\n", "г 0 non-null float64\n", "dtypes: float64(29), int64(1), object(4)\n", "memory usage: 23.3+ MB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Таблица достаточно большая, поэтому давайте выберем те столбцы, которые понадобятся нам для работы. Какие именно? Столбцы в этой базе имеют порядковый номер строки в таблице на [сайте]() Центральной избирательной комиссии.\n", "\n", "Выберем столбцы, которые соответствуют уровням комиссий, а также следующим показателям: общее число зарегистрированных избирателей, число недействительных бюллетеней, число действительных бюллетеней, число голосов за Жириновского, Зюганова, Миронова, Прохорова и Путина." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "d = df[[\"kom1\", \"kom2\", \"kom3\", \"1\", \"9\", \"10\", \"19\", \"20\", \"21\", \"22\", \"23\"]]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
kom1kom2kom319101920212223
0Республика Адыгея (Адыгея)АдыгейскаяУИК №12383.019.01571.024.0382.028.071.01066.0
1Республика Адыгея (Адыгея)АдыгейскаяУИК №22865.029.01831.051.0453.049.0104.01174.0
2Республика Адыгея (Адыгея)АдыгейскаяУИК №32821.031.01673.036.0481.024.0107.01025.0
3Республика Адыгея (Адыгея)АдыгейскаяУИК №42069.00.01246.00.0414.00.048.0784.0
4Республика Адыгея (Адыгея)АдыгейскаяУИК №5777.08.0454.019.0138.04.07.0286.0
\n", "
" ], "text/plain": [ " kom1 kom2 kom3 1 9 10 19 \\\n", "0 Республика Адыгея (Адыгея) Адыгейская УИК №1 2383.0 19.0 1571.0 24.0 \n", "1 Республика Адыгея (Адыгея) Адыгейская УИК №2 2865.0 29.0 1831.0 51.0 \n", "2 Республика Адыгея (Адыгея) Адыгейская УИК №3 2821.0 31.0 1673.0 36.0 \n", "3 Республика Адыгея (Адыгея) Адыгейская УИК №4 2069.0 0.0 1246.0 0.0 \n", "4 Республика Адыгея (Адыгея) Адыгейская УИК №5 777.0 8.0 454.0 19.0 \n", "\n", " 20 21 22 23 \n", "0 382.0 28.0 71.0 1066.0 \n", "1 453.0 49.0 104.0 1174.0 \n", "2 481.0 24.0 107.0 1025.0 \n", "3 414.0 0.0 48.0 784.0 \n", "4 138.0 4.0 7.0 286.0 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь присвоим столбцам более информативные названия:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "d.columns = [\"region\", \"tik\", \"uik\", \"total\", \"invalid\", \"valid\", \"Zh\", \"Zu\", \"Mi\", \"Pr\", \"Pu\"]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
regiontikuiktotalinvalidvalidZhZuMiPrPu
0Республика Адыгея (Адыгея)АдыгейскаяУИК №12383.019.01571.024.0382.028.071.01066.0
1Республика Адыгея (Адыгея)АдыгейскаяУИК №22865.029.01831.051.0453.049.0104.01174.0
2Республика Адыгея (Адыгея)АдыгейскаяУИК №32821.031.01673.036.0481.024.0107.01025.0
3Республика Адыгея (Адыгея)АдыгейскаяУИК №42069.00.01246.00.0414.00.048.0784.0
4Республика Адыгея (Адыгея)АдыгейскаяУИК №5777.08.0454.019.0138.04.07.0286.0
\n", "
" ], "text/plain": [ " region tik uik total invalid valid \\\n", "0 Республика Адыгея (Адыгея) Адыгейская УИК №1 2383.0 19.0 1571.0 \n", "1 Республика Адыгея (Адыгея) Адыгейская УИК №2 2865.0 29.0 1831.0 \n", "2 Республика Адыгея (Адыгея) Адыгейская УИК №3 2821.0 31.0 1673.0 \n", "3 Республика Адыгея (Адыгея) Адыгейская УИК №4 2069.0 0.0 1246.0 \n", "4 Республика Адыгея (Адыгея) Адыгейская УИК №5 777.0 8.0 454.0 \n", "\n", " Zh Zu Mi Pr Pu \n", "0 24.0 382.0 28.0 71.0 1066.0 \n", "1 51.0 453.0 49.0 104.0 1174.0 \n", "2 36.0 481.0 24.0 107.0 1025.0 \n", "3 0.0 414.0 0.0 48.0 784.0 \n", "4 19.0 138.0 4.0 7.0 286.0 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.head() # опять посмотрим" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посмотрим теперь, какие регионы есть в базе. Выбрать столбец *region* в таком случае будет не совсем удачно, поскольку в нем будет много повторяющихся значенийй. Посмотрим только на уникальные:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['Республика Адыгея (Адыгея)', 'Республика Алтай',\n", " 'Республика Башкортостан', 'Республика Бурятия',\n", " 'Республика Дагестан', 'Ðåñïóáëèêà Äàãåñòàí',\n", " 'Республика Ингушетия', 'Кабардино-Балкарская Республика',\n", " 'Республика Калмыкия', 'Карачаево-Черкесская Республика',\n", " 'Республика Карелия', 'Республика Коми', 'Республика Марий Эл',\n", " 'Республика Мордовия', 'Республика Саха (Якутия)',\n", " 'Республика Северная Осетия - Алания', 'Республика Тыва',\n", " 'Удмуртская Республика', 'Республика Хакасия',\n", " 'Чувашская Республика - Чувашия', 'Алтайский край',\n", " 'Забайкальский край', 'Камчатский край', 'Краснодарский край',\n", " 'Красноярский край', 'Пермский край', 'Приморский край',\n", " 'Ставропольский край', 'Хабаровский край', 'Õàáàðîâñêèé êðàé',\n", " 'Амурская область', 'Архангельская область',\n", " 'Астраханская область', 'Белгородская область', 'Брянская область',\n", " 'Владимирская область', 'Волгоградская область',\n", " 'Вологодская область', 'Воронежская область', 'Ивановская область',\n", " 'Иркутская область', 'Калужская область', 'Кемеровская область',\n", " 'Кировская область', 'Костромская область', 'Курганская область',\n", " 'Курская область', 'Ленинградская область', 'Липецкая область',\n", " 'Магаданская область', 'Московская область', 'Мурманская область',\n", " 'Ìóðìàíñêàÿ îáëàñòü', 'Нижегородская область',\n", " 'Новгородская область', 'Новосибирская область', 'Омская область',\n", " 'Оренбургская область', 'Орловская область', 'Пензенская область',\n", " 'Псковская область', 'Ростовская область', 'Рязанская область',\n", " 'Самарская область', 'Саратовская область', 'Сахалинская область',\n", " 'Свердловская область', 'Смоленская область', 'Тамбовская область',\n", " 'Тверская область', 'Томская область', 'Тульская область',\n", " 'Тюменская область', 'Ульяновская область', 'Челябинская область',\n", " 'Город Москва', 'Город Санкт-Петербург', 'Ãîðîä Ñàíêò-Ïåòåðáóðã',\n", " 'Еврейская автономная область', 'Ненецкий автономный округ',\n", " 'Чукотский автономный округ', 'Ямало-Ненецкий автономный округ',\n", " 'Город Байконур (Республика Казахстан)',\n", " 'Территория за пределами РФ'], dtype=object)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.region.unique() # метод unique - уникальные значения" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Видно, что в этом массиве встречаются какие-то крокозябры (названия со странной кодировкой). Давайте уберем эти строки из базы." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# отфильтруем с помощью условий\n", "d = d[(d.region != 'Ðåñïóáëèêà Äàãåñòàí') & \n", " (d.region != 'Õàáàðîâñêèé êðàé') & \n", " (d.region != 'Ìóðìàíñêàÿ îáëàñòü') & (d.region != 'Ãîðîä Ñàíêò-Ïåòåðáóðã')]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сгруппируем данные по регионам и посчитаем для каждого региона явку в процентах и процент голосов за каждого кандидата. Группировка осуществляется с помощью метода `.groupby()`." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.groupby('region') # пока ничего не увидели" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Что выдает метод `.groupby()`? На самом деле он делает следующее: создает список, состоящий из кортежей. Каждый кортеж ‒ это пара *название группы*-*соответствующий ей фрагмент датафрейма*." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# посмотрим на все сразу\n", "for g in d.groupby('region'):\n", " print(g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В таком виде метод `.groupby()` дает нам немного. Мы же хотим не просто получать отдельные таблицы, а агрегировать данные по регионам ‒ суммировать все показатели (число избирателей, бюллетеней, голосов) по каждому региону. Тут на помощь придет метод `.agg()`, который выполняет агрегирование по группам." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
totalinvalidvalidZhZuMiPrPu
region
Алтайский край1961328.012004.01163426.097961.0261665.045883.083778.0674139.0
Амурская область662320.04708.0394996.039717.067433.013594.023070.0251182.0
Архангельская область988678.05522.0569492.051169.091648.033223.060108.0333344.0
Астраханская область769608.05107.0427496.021918.067662.018595.021873.0297448.0
Белгородская область1210590.010209.0889764.059561.0211079.035601.049807.0533716.0
Брянская область1045083.06922.0692926.042974.0146340.023453.032141.0448018.0
Владимирская область1202174.08484.0629526.053615.0132400.041895.060315.0341301.0
Волгоградская область2003455.012696.01265720.087657.0240998.055325.071142.0810598.0
Вологодская область987574.06596.0601999.049492.093417.040306.057064.0361720.0
Воронежская область1918524.013073.01291271.081081.0292379.047974.069813.0800024.0
Город Байконур (Республика Казахстан)15116.0185.010422.0586.01288.0317.0722.07509.0
Город Москва7309869.087698.04159740.0267418.0814573.0214703.0868736.01994310.0
Город Санкт-Петербург3849426.033331.02355236.0110979.0311937.0157768.0370799.01403753.0
Еврейская автономная область135703.01208.078205.06632.014796.02763.05102.048912.0
Забайкальский край831712.05271.0493136.049612.071636.015015.029466.0327407.0
Ивановская область866474.05338.0513901.037650.095005.023060.037016.0321170.0
Иркутская область1915179.012186.01060537.088419.0242097.041152.094008.0594861.0
Кабардино-Балкарская Республика528147.0418.0385368.011888.053261.011753.08937.0299529.0
Калужская область798196.06327.0500606.037634.0101459.021427.040911.0299175.0
Камчатский край256522.01951.0154696.016504.025009.05430.014015.093738.0
Карачаево-Черкесская Республика319473.0631.0290989.02851.016937.02162.02629.0266410.0
Кемеровская область2076673.016002.01626578.0112067.0133705.037450.075519.01267837.0
Кировская область1125794.07864.0682321.054531.0127982.036005.063993.0399810.0
Костромская область567472.03076.0345513.028204.090714.016094.026517.0183984.0
Краснодарский край3803307.032893.02659197.0176119.0496909.088976.0181844.01715349.0
Красноярский край2192321.016279.01287567.0112222.0235058.046123.0109827.0784337.0
Курганская область751903.04314.0478077.041340.083955.019280.027725.0305777.0
Курская область947765.06350.0600367.049744.0122775.023101.038002.0366745.0
Ленинградская область1281947.010664.0800093.054857.0114951.047518.080874.0501893.0
Липецкая область954695.07751.0618784.044697.0132408.024722.034778.0382179.0
...........................
Республика Калмыкия214497.01242.0131760.03374.023295.03562.08029.093500.0
Республика Карелия558774.03839.0305600.026579.050957.018886.037798.0171380.0
Республика Коми750661.06970.0518810.040314.070135.022738.043759.0341864.0
Республика Марий Эл537932.03984.0377164.024895.084200.015175.024282.0228612.0
Республика Мордовия649355.03796.0577911.013635.042060.06448.09353.0506415.0
Республика Саха (Якутия)614351.03978.0453719.020010.065871.020193.029712.0317933.0
Республика Северная Осетия - Алания512245.03995.0409435.013063.087017.012864.06848.0289643.0
Республика Тыва159341.0860.0146720.02574.06370.02023.02925.0132828.0
Республика Хакасия382578.02819.0244660.020991.050872.08878.019400.0144519.0
Ростовская область3315673.021742.02091438.0132418.0423884.076633.0134461.01324042.0
Рязанская область967998.06508.0614459.047068.0132981.025562.037903.0370945.0
Самарская область2562916.020828.01536839.0117828.0320128.061361.0125423.0912099.0
Саратовская область1991376.012400.01310761.066985.0206818.043267.059006.0934685.0
Сахалинская область398893.02846.0225504.020016.045730.08856.022337.0128565.0
Свердловская область3527808.025560.02048423.0107819.0251690.0113353.0237780.01337781.0
Смоленская область816276.05843.0476106.038246.0111182.020930.032516.0273232.0
Ставропольский край1983954.012448.01183292.083543.0215600.037551.075724.0770874.0
Тамбовская область884888.05570.0614521.028179.0107797.013973.019594.0444978.0
Тверская область1137087.07076.0660420.049384.0131591.032835.059302.0387308.0
Территория за пределами РФ459661.05838.0436093.012006.031785.08674.059942.0323686.0
Томская область787075.05194.0453117.035139.086403.016966.053028.0261581.0
Тульская область1249121.08862.0858707.050218.0147019.029601.043917.0587952.0
Тюменская область1056505.06915.0829264.059083.095398.020455.043047.0611281.0
Удмуртская Республика1218251.09048.0775357.049160.0116277.026803.067362.0515755.0
Ульяновская область1048667.06926.0659233.046384.0160089.027783.037437.0387540.0
Хабаровский край1056125.08733.0645264.068500.0115436.031944.062145.0367239.0
Челябинская область2757879.025366.01704033.097869.0254542.088177.0138907.01124538.0
Чувашская Республика - Чувашия954572.010465.0692492.039707.0144676.031201.038838.0438070.0
Чукотский автономный округ35968.0428.028909.02106.02651.0633.02209.021310.0
Ямало-Ненецкий автономный округ358834.02669.0332293.017456.018738.04979.07807.0283313.0
\n", "

80 rows × 8 columns

\n", "
" ], "text/plain": [ " total invalid valid \\\n", "region \n", "Алтайский край 1961328.0 12004.0 1163426.0 \n", "Амурская область 662320.0 4708.0 394996.0 \n", "Архангельская область 988678.0 5522.0 569492.0 \n", "Астраханская область 769608.0 5107.0 427496.0 \n", "Белгородская область 1210590.0 10209.0 889764.0 \n", "Брянская область 1045083.0 6922.0 692926.0 \n", "Владимирская область 1202174.0 8484.0 629526.0 \n", "Волгоградская область 2003455.0 12696.0 1265720.0 \n", "Вологодская область 987574.0 6596.0 601999.0 \n", "Воронежская область 1918524.0 13073.0 1291271.0 \n", "Город Байконур (Республика Казахстан) 15116.0 185.0 10422.0 \n", "Город Москва 7309869.0 87698.0 4159740.0 \n", "Город Санкт-Петербург 3849426.0 33331.0 2355236.0 \n", "Еврейская автономная область 135703.0 1208.0 78205.0 \n", "Забайкальский край 831712.0 5271.0 493136.0 \n", "Ивановская область 866474.0 5338.0 513901.0 \n", "Иркутская область 1915179.0 12186.0 1060537.0 \n", "Кабардино-Балкарская Республика 528147.0 418.0 385368.0 \n", "Калужская область 798196.0 6327.0 500606.0 \n", "Камчатский край 256522.0 1951.0 154696.0 \n", "Карачаево-Черкесская Республика 319473.0 631.0 290989.0 \n", "Кемеровская область 2076673.0 16002.0 1626578.0 \n", "Кировская область 1125794.0 7864.0 682321.0 \n", "Костромская область 567472.0 3076.0 345513.0 \n", "Краснодарский край 3803307.0 32893.0 2659197.0 \n", "Красноярский край 2192321.0 16279.0 1287567.0 \n", "Курганская область 751903.0 4314.0 478077.0 \n", "Курская область 947765.0 6350.0 600367.0 \n", "Ленинградская область 1281947.0 10664.0 800093.0 \n", "Липецкая область 954695.0 7751.0 618784.0 \n", "... ... ... ... \n", "Республика Калмыкия 214497.0 1242.0 131760.0 \n", "Республика Карелия 558774.0 3839.0 305600.0 \n", "Республика Коми 750661.0 6970.0 518810.0 \n", "Республика Марий Эл 537932.0 3984.0 377164.0 \n", "Республика Мордовия 649355.0 3796.0 577911.0 \n", "Республика Саха (Якутия) 614351.0 3978.0 453719.0 \n", "Республика Северная Осетия - Алания 512245.0 3995.0 409435.0 \n", "Республика Тыва 159341.0 860.0 146720.0 \n", "Республика Хакасия 382578.0 2819.0 244660.0 \n", "Ростовская область 3315673.0 21742.0 2091438.0 \n", "Рязанская область 967998.0 6508.0 614459.0 \n", "Самарская область 2562916.0 20828.0 1536839.0 \n", "Саратовская область 1991376.0 12400.0 1310761.0 \n", "Сахалинская область 398893.0 2846.0 225504.0 \n", "Свердловская область 3527808.0 25560.0 2048423.0 \n", "Смоленская область 816276.0 5843.0 476106.0 \n", "Ставропольский край 1983954.0 12448.0 1183292.0 \n", "Тамбовская область 884888.0 5570.0 614521.0 \n", "Тверская область 1137087.0 7076.0 660420.0 \n", "Территория за пределами РФ 459661.0 5838.0 436093.0 \n", "Томская область 787075.0 5194.0 453117.0 \n", "Тульская область 1249121.0 8862.0 858707.0 \n", "Тюменская область 1056505.0 6915.0 829264.0 \n", "Удмуртская Республика 1218251.0 9048.0 775357.0 \n", "Ульяновская область 1048667.0 6926.0 659233.0 \n", "Хабаровский край 1056125.0 8733.0 645264.0 \n", "Челябинская область 2757879.0 25366.0 1704033.0 \n", "Чувашская Республика - Чувашия 954572.0 10465.0 692492.0 \n", "Чукотский автономный округ 35968.0 428.0 28909.0 \n", "Ямало-Ненецкий автономный округ 358834.0 2669.0 332293.0 \n", "\n", " Zh Zu Mi Pr \\\n", "region \n", "Алтайский край 97961.0 261665.0 45883.0 83778.0 \n", "Амурская область 39717.0 67433.0 13594.0 23070.0 \n", "Архангельская область 51169.0 91648.0 33223.0 60108.0 \n", "Астраханская область 21918.0 67662.0 18595.0 21873.0 \n", "Белгородская область 59561.0 211079.0 35601.0 49807.0 \n", "Брянская область 42974.0 146340.0 23453.0 32141.0 \n", "Владимирская область 53615.0 132400.0 41895.0 60315.0 \n", "Волгоградская область 87657.0 240998.0 55325.0 71142.0 \n", "Вологодская область 49492.0 93417.0 40306.0 57064.0 \n", "Воронежская область 81081.0 292379.0 47974.0 69813.0 \n", "Город Байконур (Республика Казахстан) 586.0 1288.0 317.0 722.0 \n", "Город Москва 267418.0 814573.0 214703.0 868736.0 \n", "Город Санкт-Петербург 110979.0 311937.0 157768.0 370799.0 \n", "Еврейская автономная область 6632.0 14796.0 2763.0 5102.0 \n", "Забайкальский край 49612.0 71636.0 15015.0 29466.0 \n", "Ивановская область 37650.0 95005.0 23060.0 37016.0 \n", "Иркутская область 88419.0 242097.0 41152.0 94008.0 \n", "Кабардино-Балкарская Республика 11888.0 53261.0 11753.0 8937.0 \n", "Калужская область 37634.0 101459.0 21427.0 40911.0 \n", "Камчатский край 16504.0 25009.0 5430.0 14015.0 \n", "Карачаево-Черкесская Республика 2851.0 16937.0 2162.0 2629.0 \n", "Кемеровская область 112067.0 133705.0 37450.0 75519.0 \n", "Кировская область 54531.0 127982.0 36005.0 63993.0 \n", "Костромская область 28204.0 90714.0 16094.0 26517.0 \n", "Краснодарский край 176119.0 496909.0 88976.0 181844.0 \n", "Красноярский край 112222.0 235058.0 46123.0 109827.0 \n", "Курганская область 41340.0 83955.0 19280.0 27725.0 \n", "Курская область 49744.0 122775.0 23101.0 38002.0 \n", "Ленинградская область 54857.0 114951.0 47518.0 80874.0 \n", "Липецкая область 44697.0 132408.0 24722.0 34778.0 \n", "... ... ... ... ... \n", "Республика Калмыкия 3374.0 23295.0 3562.0 8029.0 \n", "Республика Карелия 26579.0 50957.0 18886.0 37798.0 \n", "Республика Коми 40314.0 70135.0 22738.0 43759.0 \n", "Республика Марий Эл 24895.0 84200.0 15175.0 24282.0 \n", "Республика Мордовия 13635.0 42060.0 6448.0 9353.0 \n", "Республика Саха (Якутия) 20010.0 65871.0 20193.0 29712.0 \n", "Республика Северная Осетия - Алания 13063.0 87017.0 12864.0 6848.0 \n", "Республика Тыва 2574.0 6370.0 2023.0 2925.0 \n", "Республика Хакасия 20991.0 50872.0 8878.0 19400.0 \n", "Ростовская область 132418.0 423884.0 76633.0 134461.0 \n", "Рязанская область 47068.0 132981.0 25562.0 37903.0 \n", "Самарская область 117828.0 320128.0 61361.0 125423.0 \n", "Саратовская область 66985.0 206818.0 43267.0 59006.0 \n", "Сахалинская область 20016.0 45730.0 8856.0 22337.0 \n", "Свердловская область 107819.0 251690.0 113353.0 237780.0 \n", "Смоленская область 38246.0 111182.0 20930.0 32516.0 \n", "Ставропольский край 83543.0 215600.0 37551.0 75724.0 \n", "Тамбовская область 28179.0 107797.0 13973.0 19594.0 \n", "Тверская область 49384.0 131591.0 32835.0 59302.0 \n", "Территория за пределами РФ 12006.0 31785.0 8674.0 59942.0 \n", "Томская область 35139.0 86403.0 16966.0 53028.0 \n", "Тульская область 50218.0 147019.0 29601.0 43917.0 \n", "Тюменская область 59083.0 95398.0 20455.0 43047.0 \n", "Удмуртская Республика 49160.0 116277.0 26803.0 67362.0 \n", "Ульяновская область 46384.0 160089.0 27783.0 37437.0 \n", "Хабаровский край 68500.0 115436.0 31944.0 62145.0 \n", "Челябинская область 97869.0 254542.0 88177.0 138907.0 \n", "Чувашская Республика - Чувашия 39707.0 144676.0 31201.0 38838.0 \n", "Чукотский автономный округ 2106.0 2651.0 633.0 2209.0 \n", "Ямало-Ненецкий автономный округ 17456.0 18738.0 4979.0 7807.0 \n", "\n", " Pu \n", "region \n", "Алтайский край 674139.0 \n", "Амурская область 251182.0 \n", "Архангельская область 333344.0 \n", "Астраханская область 297448.0 \n", "Белгородская область 533716.0 \n", "Брянская область 448018.0 \n", "Владимирская область 341301.0 \n", "Волгоградская область 810598.0 \n", "Вологодская область 361720.0 \n", "Воронежская область 800024.0 \n", "Город Байконур (Республика Казахстан) 7509.0 \n", "Город Москва 1994310.0 \n", "Город Санкт-Петербург 1403753.0 \n", "Еврейская автономная область 48912.0 \n", "Забайкальский край 327407.0 \n", "Ивановская область 321170.0 \n", "Иркутская область 594861.0 \n", "Кабардино-Балкарская Республика 299529.0 \n", "Калужская область 299175.0 \n", "Камчатский край 93738.0 \n", "Карачаево-Черкесская Республика 266410.0 \n", "Кемеровская область 1267837.0 \n", "Кировская область 399810.0 \n", "Костромская область 183984.0 \n", "Краснодарский край 1715349.0 \n", "Красноярский край 784337.0 \n", "Курганская область 305777.0 \n", "Курская область 366745.0 \n", "Ленинградская область 501893.0 \n", "Липецкая область 382179.0 \n", "... ... \n", "Республика Калмыкия 93500.0 \n", "Республика Карелия 171380.0 \n", "Республика Коми 341864.0 \n", "Республика Марий Эл 228612.0 \n", "Республика Мордовия 506415.0 \n", "Республика Саха (Якутия) 317933.0 \n", "Республика Северная Осетия - Алания 289643.0 \n", "Республика Тыва 132828.0 \n", "Республика Хакасия 144519.0 \n", "Ростовская область 1324042.0 \n", "Рязанская область 370945.0 \n", "Самарская область 912099.0 \n", "Саратовская область 934685.0 \n", "Сахалинская область 128565.0 \n", "Свердловская область 1337781.0 \n", "Смоленская область 273232.0 \n", "Ставропольский край 770874.0 \n", "Тамбовская область 444978.0 \n", "Тверская область 387308.0 \n", "Территория за пределами РФ 323686.0 \n", "Томская область 261581.0 \n", "Тульская область 587952.0 \n", "Тюменская область 611281.0 \n", "Удмуртская Республика 515755.0 \n", "Ульяновская область 387540.0 \n", "Хабаровский край 367239.0 \n", "Челябинская область 1124538.0 \n", "Чувашская Республика - Чувашия 438070.0 \n", "Чукотский автономный округ 21310.0 \n", "Ямало-Ненецкий автономный округ 283313.0 \n", "\n", "[80 rows x 8 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.groupby('region').agg('sum')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сначала в `.groupby()` мы указали переменную, по которой нужно выполнить группировку, затем в `.agg()` мы указали функцию, которую нужно выполнить. В нашем случае это 'sum', поскольку нам нужно просто сложить все показатели в пределах одного региона. Применять можно и другие функции, например, считать среднее:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
totalinvalidvalidZhZuMiPrPu
region
Алтайский край1053.3447916.446831624.82599452.610634140.52900124.64178344.993555362.051020
Амурская область845.8748406.012771504.46487950.72413886.12132817.36143029.463602320.794381
Архангельская область1004.7540655.611789578.75203352.00101693.13821133.76321161.085366338.764228
Астраханская область1313.3242328.715017729.51535837.402730115.46416431.73208237.325939507.590444
Белгородская область968.4720008.167200711.81120047.648800168.86320028.48080039.845600426.972800
\n", "
" ], "text/plain": [ " total invalid valid Zh \\\n", "region \n", "Алтайский край 1053.344791 6.446831 624.825994 52.610634 \n", "Амурская область 845.874840 6.012771 504.464879 50.724138 \n", "Архангельская область 1004.754065 5.611789 578.752033 52.001016 \n", "Астраханская область 1313.324232 8.715017 729.515358 37.402730 \n", "Белгородская область 968.472000 8.167200 711.811200 47.648800 \n", "\n", " Zu Mi Pr Pu \n", "region \n", "Алтайский край 140.529001 24.641783 44.993555 362.051020 \n", "Амурская область 86.121328 17.361430 29.463602 320.794381 \n", "Архангельская область 93.138211 33.763211 61.085366 338.764228 \n", "Астраханская область 115.464164 31.732082 37.325939 507.590444 \n", "Белгородская область 168.863200 28.480800 39.845600 426.972800 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.groupby('region').agg('mean').head() # mean - среднее" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Или сразу несколько статистик. которые можно указать в `.agg()` в виде списка." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
totalinvalidvalidZhZuMiPrPu
meanmedianmeanmedianmeanmedianmeanmedianmeanmedianmeanmedianmeanmedianmeanmedian
region
Алтайский край1053.344791823.06.4468314.0624.825994495.052.61063441.0140.529001109.524.64178315.044.99355522.0362.051020305.5
Амурская область845.874840523.06.0127714.0504.464879326.050.72413831.086.12132852.017.3614309.029.46360212.0320.794381224.0
Архангельская область1004.754065581.55.6117892.0578.752033332.552.00101629.093.13821144.033.76321119.061.08536620.5338.764228230.5
Астраханская область1313.3242321283.58.7150176.0729.515358692.537.40273031.0115.464164100.531.73208222.037.32593922.0507.590444480.0
Белгородская область968.472000802.08.1672006.0711.811200633.047.64880041.0168.863200140.528.48080021.039.84560022.0426.972800397.0
\n", "
" ], "text/plain": [ " total invalid valid \\\n", " mean median mean median mean \n", "region \n", "Алтайский край 1053.344791 823.0 6.446831 4.0 624.825994 \n", "Амурская область 845.874840 523.0 6.012771 4.0 504.464879 \n", "Архангельская область 1004.754065 581.5 5.611789 2.0 578.752033 \n", "Астраханская область 1313.324232 1283.5 8.715017 6.0 729.515358 \n", "Белгородская область 968.472000 802.0 8.167200 6.0 711.811200 \n", "\n", " Zh Zu Mi \\\n", " median mean median mean median mean \n", "region \n", "Алтайский край 495.0 52.610634 41.0 140.529001 109.5 24.641783 \n", "Амурская область 326.0 50.724138 31.0 86.121328 52.0 17.361430 \n", "Архангельская область 332.5 52.001016 29.0 93.138211 44.0 33.763211 \n", "Астраханская область 692.5 37.402730 31.0 115.464164 100.5 31.732082 \n", "Белгородская область 633.0 47.648800 41.0 168.863200 140.5 28.480800 \n", "\n", " Pr Pu \n", " median mean median mean median \n", "region \n", "Алтайский край 15.0 44.993555 22.0 362.051020 305.5 \n", "Амурская область 9.0 29.463602 12.0 320.794381 224.0 \n", "Архангельская область 19.0 61.085366 20.5 338.764228 230.5 \n", "Астраханская область 22.0 37.325939 22.0 507.590444 480.0 \n", "Белгородская область 21.0 39.845600 22.0 426.972800 397.0 " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.groupby('region').agg(['mean', 'median']).head() # среднее и медиана" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Кроме того, внутри `.agg()` можно указывать свои функции. Например, нас интересует разница между максимальным и минимальным значением. Сначала напишем функцию `my_diff`, которая будет определять такую разность:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "def my_diff(x):\n", " return max(x) - min(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Проверим, как она работает:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_diff([4, 6, 8]) # все верно, 8 - 4 = 4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь используем эту функцию внутри `.agg()`:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
totalinvalidvalidZhZuMiPrPu
region
Алтайский край3030.072.02389.0379.0573.0131.0351.01639.0
Амурская область2942.0130.01773.0267.0404.092.0197.01201.0
Архангельская область2953.076.01951.0232.0407.0153.0369.01205.0
Астраханская область2936.0223.01862.0209.0411.0157.0234.01367.0
Белгородская область2998.071.02118.0234.0612.0108.0335.01268.0
\n", "
" ], "text/plain": [ " total invalid valid Zh Zu Mi Pr \\\n", "region \n", "Алтайский край 3030.0 72.0 2389.0 379.0 573.0 131.0 351.0 \n", "Амурская область 2942.0 130.0 1773.0 267.0 404.0 92.0 197.0 \n", "Архангельская область 2953.0 76.0 1951.0 232.0 407.0 153.0 369.0 \n", "Астраханская область 2936.0 223.0 1862.0 209.0 411.0 157.0 234.0 \n", "Белгородская область 2998.0 71.0 2118.0 234.0 612.0 108.0 335.0 \n", "\n", " Pu \n", "region \n", "Алтайский край 1639.0 \n", "Амурская область 1201.0 \n", "Архангельская область 1205.0 \n", "Астраханская область 1367.0 \n", "Белгородская область 1268.0 " ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.groupby('region').agg(my_diff).head() # везде смотрим на первые 5 строк" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Возможностей на самом деле у метода `.agg()` много, но давайте более продвинутые вещи оставим на потом (будет выложен отдельный конспект с дополнительными материалами).\n", "\n", "Все, что мы пока сделали, очень интересно, но есть проблема: все данные пока даны в абсолютных значениях, не в процентах. Это неудобно. Давайте сгруппируем данные по региону и добавим в базу с агрегированными данными новые столбцы: явка в процентах и проценты голосов за каждого кандидата.\n", "\n", "Для этого необходимо вспомнить, как считается явка и проценты голосов. Явка считается так: суммируем число действительных и недействительных бюллетеней. Чтобы получить явку в процентах, делим явку на общее число зарегистрированных избирателей и домножаем на 100, чтобы перевести долю в проценты. Проценты голосов за кандидатов считаем от явки, берем число голосов за кандидата, делим на явку и домножаем на 100. Проделаем это поэтапно. \n", "\n", "Сначала сохраним результат агрегирования в переменную `regs` и добавим новый столбец для явки в абсолютных значениях (в голосах)." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "regs = d.groupby('region').agg('sum')\n", "\n", "regs[\"turnout\"] = regs.invalid + regs.valid # новый столбец - сумма двух старых" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
totalinvalidvalidZhZuMiPrPuturnout
region
Алтайский край1961328.012004.01163426.097961.0261665.045883.083778.0674139.01175430.0
Амурская область662320.04708.0394996.039717.067433.013594.023070.0251182.0399704.0
Архангельская область988678.05522.0569492.051169.091648.033223.060108.0333344.0575014.0
\n", "
" ], "text/plain": [ " total invalid valid Zh Zu \\\n", "region \n", "Алтайский край 1961328.0 12004.0 1163426.0 97961.0 261665.0 \n", "Амурская область 662320.0 4708.0 394996.0 39717.0 67433.0 \n", "Архангельская область 988678.0 5522.0 569492.0 51169.0 91648.0 \n", "\n", " Mi Pr Pu turnout \n", "region \n", "Алтайский край 45883.0 83778.0 674139.0 1175430.0 \n", "Амурская область 13594.0 23070.0 251182.0 399704.0 \n", "Архангельская область 33223.0 60108.0 333344.0 575014.0 " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regs.head(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь добавим столбец с явкой в процентах:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "regs[\"turnout_perc\"] = regs.turnout / regs.total * 100" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
totalinvalidvalidZhZuMiPrPuturnoutturnout_perc
region
Алтайский край1961328.012004.01163426.097961.0261665.045883.083778.0674139.01175430.059.930313
Амурская область662320.04708.0394996.039717.067433.013594.023070.0251182.0399704.060.349076
Архангельская область988678.05522.0569492.051169.091648.033223.060108.0333344.0575014.058.159886
\n", "
" ], "text/plain": [ " total invalid valid Zh Zu \\\n", "region \n", "Алтайский край 1961328.0 12004.0 1163426.0 97961.0 261665.0 \n", "Амурская область 662320.0 4708.0 394996.0 39717.0 67433.0 \n", "Архангельская область 988678.0 5522.0 569492.0 51169.0 91648.0 \n", "\n", " Mi Pr Pu turnout turnout_perc \n", "region \n", "Алтайский край 45883.0 83778.0 674139.0 1175430.0 59.930313 \n", "Амурская область 13594.0 23070.0 251182.0 399704.0 60.349076 \n", "Архангельская область 33223.0 60108.0 333344.0 575014.0 58.159886 " ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regs.head(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталось проделать аналогичные операции для голосов за разных кандидатов. Но повторять одно и то же пять раз не хочется (а что бы мы делали, если бы кандидатов было больше?). Давайте напишем функцию, которая будет принимать на вход столбец, делить все его значения на значения из столбца *turnout* и переводить все в проценты." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "def to_perc(x):\n", " return x / regs.turnout * 100" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "А теперь выберем из базы данных столбцы с голосами за кандидатов и применим к ним нашу функцию." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "perc = regs[['Zh' ,'Zu', 'Mi', 'Pr', 'Pu']].apply(to_perc, axis = 0) # axis = 0 - по столбцам, не по строкам " ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ZhZuMiPrPu
region
Алтайский край8.33405622.2612153.9035087.12743457.352543
Амурская область9.93660316.8707343.4010175.77177162.842003
Архангельская область8.89874015.9383955.77777210.45331157.971458
\n", "
" ], "text/plain": [ " Zh Zu Mi Pr Pu\n", "region \n", "Алтайский край 8.334056 22.261215 3.903508 7.127434 57.352543\n", "Амурская область 9.936603 16.870734 3.401017 5.771771 62.842003\n", "Архангельская область 8.898740 15.938395 5.777772 10.453311 57.971458" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "perc.head(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Нужно переименовать столбцы в базе `perc`. Давайте сделаем это по-умному: возьмем названия столбцов в `perc` и приклеим к ним часть с `_perc`, чтобы названия столбцов с показателями в процентах отличались от показателей в абсолютных числах." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Zh', 'Zu', 'Mi', 'Pr', 'Pu']" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "old_cols = list(perc.columns)\n", "old_cols" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Zh_perc', 'Zu_perc', 'Mi_perc', 'Pr_perc', 'Pu_perc']" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_cols = [x + \"_perc\" for x in old_cols]\n", "new_cols" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "perc.columns = new_cols" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Zh_percZu_percMi_percPr_percPu_perc
region
Алтайский край8.33405622.2612153.9035087.12743457.352543
Амурская область9.93660316.8707343.4010175.77177162.842003
Архангельская область8.89874015.9383955.77777210.45331157.971458
\n", "
" ], "text/plain": [ " Zh_perc Zu_perc Mi_perc Pr_perc Pu_perc\n", "region \n", "Алтайский край 8.334056 22.261215 3.903508 7.127434 57.352543\n", "Амурская область 9.936603 16.870734 3.401017 5.771771 62.842003\n", "Архангельская область 8.898740 15.938395 5.777772 10.453311 57.971458" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "perc.head(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ура! Последний аккорд: соединим нашу таблицу `regs` с таблицей `perc`, чтобы все показатели были в одном месте. Способов объединять датафреймы много, но давайте обсудим их в следующий раз. А пока просто склеим две таблицы по столбцам с помощью метода `.concat()`." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "final = pd.concat([regs, perc], axis = 1) # axis = 1 - по столбцам" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
totalinvalidvalidZhZuMiPrPuturnoutturnout_percZh_percZu_percMi_percPr_percPu_perc
region
Алтайский край1961328.012004.01163426.097961.0261665.045883.083778.0674139.01175430.059.9303138.33405622.2612153.9035087.12743457.352543
Амурская область662320.04708.0394996.039717.067433.013594.023070.0251182.0399704.060.3490769.93660316.8707343.4010175.77177162.842003
Архангельская область988678.05522.0569492.051169.091648.033223.060108.0333344.0575014.058.1598868.89874015.9383955.77777210.45331157.971458
Астраханская область769608.05107.0427496.021918.067662.018595.021873.0297448.0432603.056.2108245.06653915.6406684.2983985.05613768.757729
Белгородская область1210590.010209.0889764.059561.0211079.035601.049807.0533716.0899973.074.3416856.61808723.4539263.9557855.53427759.303557
\n", "
" ], "text/plain": [ " total invalid valid Zh Zu \\\n", "region \n", "Алтайский край 1961328.0 12004.0 1163426.0 97961.0 261665.0 \n", "Амурская область 662320.0 4708.0 394996.0 39717.0 67433.0 \n", "Архангельская область 988678.0 5522.0 569492.0 51169.0 91648.0 \n", "Астраханская область 769608.0 5107.0 427496.0 21918.0 67662.0 \n", "Белгородская область 1210590.0 10209.0 889764.0 59561.0 211079.0 \n", "\n", " Mi Pr Pu turnout turnout_perc \\\n", "region \n", "Алтайский край 45883.0 83778.0 674139.0 1175430.0 59.930313 \n", "Амурская область 13594.0 23070.0 251182.0 399704.0 60.349076 \n", "Архангельская область 33223.0 60108.0 333344.0 575014.0 58.159886 \n", "Астраханская область 18595.0 21873.0 297448.0 432603.0 56.210824 \n", "Белгородская область 35601.0 49807.0 533716.0 899973.0 74.341685 \n", "\n", " Zh_perc Zu_perc Mi_perc Pr_perc Pu_perc \n", "region \n", "Алтайский край 8.334056 22.261215 3.903508 7.127434 57.352543 \n", "Амурская область 9.936603 16.870734 3.401017 5.771771 62.842003 \n", "Архангельская область 8.898740 15.938395 5.777772 10.453311 57.971458 \n", "Астраханская область 5.066539 15.640668 4.298398 5.056137 68.757729 \n", "Белгородская область 6.618087 23.453926 3.955785 5.534277 59.303557 " ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "На этом пока всё." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.4" } }, "nbformat": 4, "nbformat_minor": 4 }