Как использовать 'group by' в Python?
pandas GroupBy: Руководство по группировке данных в Python
Этот туториал поможет вам разобраться и визуализировать операцию pandas GroupBy от начала до конца. В нем вы узнаете, как использовать операции pandas GroupBy с реальными данными, как работает последовательность операций “split-apply-combine” и как разбить эту последовательность на отдельные шаги. Также будет рассмотрено классификация методов объекта pandas GroupBy на основе их намерения и результата.
Содержание
- Prerequisites
- Пример 1: Датасет о Конгрессе США
- Пример 2: Датасет качества воздуха
- Пример 3: Датасет новостного агрегатора
- pandas GroupBy: все объединено
- Заключение
Prerequisites
- Windows
- Linux + macOS
Windows PowerShell:
Shell:
В этом туториале мы сосредоточимся на трех наборах данных:
- Датасет Конгресса США, который содержит публичную информацию о исторических членах Конгресса и иллюстрирует несколько основных возможностей
.groupby()
. - Датасет качества воздуха, содержащий периодические показания датчиков газа. Благодаря этому вы сможете работать с числами с плавающей запятой и временными рядами.
- Датасет новостного агрегатора, содержащий метаданные сотен тысяч новостных статей. Вы будете работать со строками и выполнять манипуляции с текстом с помощью
.groupby()
.
Скачать исходный код для всех примеров в этом туториале вы можете по ссылке ниже:
После загрузки файлов .zip
распакуйте их в папку с именем “datasets”.
Пример 1: Датасет о Конгрессе США
Привет, мир! pandas GroupBy
Самым простым примером, который можно рассмотреть, является группировка данных о Конгрессе США. В этом примере мы будем использовать датасет, содержащий информацию о членах Конгресса.
Для начала импортируем необходимые модули и загрузим данные:
Результат:
id | last_name | first_name | party | chamber | birth_year | gender | congress |
---|---|---|---|---|---|---|---|
78 | Bassett | Richard | R | 1 | 1745 | 1 | 1 |
79 | Bland | Theodorick | A | 1 | 1742 | 1 | 1 |
80 | Burke | Aedanus | A | 1 | 1743 | 1 | 2 |
81 | Caroll | Daniel | A | 1 | 1730 | 1 | 2 |
82 | Clymer | George | R | 1 | 1739 | 1 | 2 |
Сгруппируем данные по полю “партия” и выведем количество записей для каждой партии:
Результат:
party | id |
---|---|
A | 105 |
D | 1066 |
DR | 301 |
F | 3 |
Ind | 5 |
J | 1 |
JDR | 1 |
Liberty | 1 |
R | 1073 |
R-D | 1 |
U | 22 |
Union | 1 |
Whig | 222 |
Таким образом, мы группируем записи по полю “партия” и подсчитываем их количество. За одну операцию мы получаем информацию о количестве записей для каждой партии в Конгрессе США.
pandas GroupBy против SQL
Рассмотрим сравнение операции GroupBy в pandas и SQL. Для примера возьмем те же данные о Конгрессе США.
Сгруппируем данные по полю “партия” в pandas:
В SQL это можно записать следующим образом:
В pandas мы можем использовать функции агрегации, такие как count()
, sum()
, mean()
, max()
и другие, чтобы получить дополнительные сведения о нашей группировке:
Результат:
party | id |
---|---|
A | 105 |
D | 1066 |
DR | 301 |
F | 3 |
Ind | 5 |
J | 1 |
JDR | 1 |
Liberty | 1 |
R | 1073 |
R-D | 1 |
U | 22 |
Union | 1 |
Whig | 222 |
Мы можем использовать функции агрегации, подобные тем, что есть в SQL, чтобы получить не только количество записей, но и другие агрегированные значения для каждой группы.
Как работает pandas GroupBy
Теперь рассмотрим подробнее, как работает операция pandas GroupBy. Разобьем данные на группы, применим функцию к каждой группе и объединим результаты в один результат.
Результат:
party | id |
---|---|
A | 105 |
D | 1066 |
DR | 301 |
F | 3 |
Ind | 5 |
J | 1 |
JDR | 1 |
Liberty | 1 |
R | 1073 |
R-D | 1 |
U | 22 |
Union | 1 |
Whig | 222 |
Таким образом, операция GroupBy разбивает данные на группы, применяет функцию к каждой группе и объединяет результаты в один результат.
Пример 2: Датасет качества воздуха
Вторым примером является группировка данных датасета качества воздуха. Для начала загрузим данные и выведем первые несколько записей:
Результат:
# | date | time | CO(GT) | PT08.S1(CO) | NMHC(GT) | C6H6(GT) | PT08.S2(NMHC) | NOx(GT) | PT08.S3(NOx) | NO2(GT) | PT08.S4(NO2) | PT08.S5(O3) | T | RH | AH |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 10/03/2004 | 18.00.00 | 2.6 | 6 | 1360 | 150 | 11 | 112 | 9 | 104 | 166 | 7 | 13 | 48 | 0.757 |
1 | 10/03/2004 | 19.00.00 | 2 | 1297 | 1353 | 112 | 9 | 88 | 9 | 94 | 103 | 6 | 13 | 47 | 0.725 |
2 | 10/03/2004 | 20.00.00 | 2.2 | 1402 | 1333 | 122 | 9 | 80 | 9 | 89 | 131 | 7 | 13 | 47 | 0.750 |
3 | 10/03/2004 | 21.00.00 | 2.2 | 1376 | 1333 | 122 | 9 | 51 | 6 | 62 | 172 | 7 | 13 | 46 | 0.786 |
4 | 10/03/2004 | 22.00.00 | 1.6 | 1272 | 1276 | 116 | 9 | 38 | 4 | 45 | 131 | 6 | 13 | 46 | 0.788 |
Группируем данные по полю “дата” и выведем среднее значение для каждой группы:
Результат:
date | # | CO(GT) | PT08.S1(CO) | NMHC(GT) | C6H6(GT) | PT08.S2(NMHC) | NOx(GT) | PT08.S3(NOx) | NO2(GT) | PT08.S4(NO2) | PT08.S5(O3) | T | RH | AH |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
01/01/2005 | 361 | 2.521 | 1207.947 | 542.117 | 8.198 | 903.342 | 189.5 | 835.25 | 97.75 | 1316 | 301.75 | 13 | 37.5 | 0.75575 |
01/02/2005 | 717 | 2.895 | 1247.231 | 361.385 | 8.83 | 903.939 | 197.692 | 874.769 | 122 | 1213.077 | 368.308 | 11 | 46.8182 | 0.867909 |
01/03/2005 | 1073 | 1.787 | 1123.157 | 310.778 | 5.025 | 771.303 | 202.172 | 838.276 | 74.5862 | 841.345 | 206.379 | 14 | 54.6957 | 0.897241 |
01/04/2004 | 17 | 1.328 | 1206.833 | 437.195 | 0.329 | 2 | 132.052 | 730.895 | 10.3043 | 181 | 389.913 | 8 | 54.7826 | 0.951652 |
01/05/2004 | 33 | 2.294 | 1280.455 | 526.452 | 4.101 | 900.242 | 151.231 | 611.303 | 51.875 | 193.586 | 496.419 | 7 | 52.914 | 0.865621 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
Таким образом, мы группируем записи по дате и выводим среднее значение каждого поля для каждой группы.
Группировка на основе производных массивов
Кроме группировки по отдельному полю, мы также можем группировать данные на основе производных массивов. Возьмем поле “CO(GT)” и создадим новый столбец “high_CO”, в котором будет значение “True”, если уровень CO(GT) выше 2, и “False” в противном случае.
Результат:
high_CO | id |
---|---|
False | 994 |
True | 506 |
Таким образом, мы создаем производный столбец “high_CO” и группируем записи на основе его значений. Затем выводим количество записей для каждой группы.
Ресемплирование
Другой интересной возможностью группировки в pandas является ресемплирование временных рядов. Возьмем поле “date” и приведем его к типу “datetime”. Затем сгруппируем данные по дням и найдем среднее значение поля “CO(GT)” для каждого дня.
Результат:
date | CO(GT) |
---|---|
2004-03-10 | 2.35 |
2004-03-11 | NaN |
2004-03-12 | 2.15 |
2004-03-13 | 2.075 |
2004-03-14 | 2.35 |
… | … |
Таким образом, мы преобразуем поле “date” к типу “datetime”, группируем данные по дням и ресемплируем полученные группы. Затем выводим среднее значение поля “CO(GT)” для каждого дня.
Пример 3: Датасет новостного агрегатора
Третьим примером является группировка данных датасета новостного агрегатора. Загрузим данные и выведем первые несколько записей:
Результат:
ID | Title | URL | Publisher | Category | Story | Hostname | Timestamp | |
---|---|---|---|---|---|---|---|---|
0 | 1 | Fed official says weak data | http://www.latimes.com/… | Los Angeles Times | b | ddUyU0VZz0BRneMiov7… | ||
1 | 2 | Filet mignon sandwiches | http://abcnews.go.com/… | ABC News | b | ddUyU0VZz0BRneMiov7… | ||
2 | 3 | US espresso to cost 7… | http://www.vancouvers… | Vancouver Sun | b | ddUyU0VZz0BRneMiov7… | ||
3 | 4 | Baseball loses a master | http://online.wsj.com/… | Wall Street Journal | b | ddUyU0VZz0BRneMiov7… | ||
4 | 5 | Russia’s daredevil defe… | http://www.aljazeera… | Aljazeera.com | b | ddUyU0VZz0BRneMiov7… |
Группируем данные по полю “Publisher” и найдем количество записей для каждого издателя:
Результат:
Publisher | ID |
---|---|
247Sports | 20 |
5280 | 2 |
9to5Google | 3 |
ABC News | 750 |
ABC11 Raleigh-Durham | 62 |
Above the Law | 2 |
AccuWeather | 341 |
AceShowbiz | 68 |
Al Jazeera | 447 |
Albuquerque | 12 |
AllAfrica.com | 354 |
… | … |
Таким образом, мы группируем записи по полю “Publisher” и выводим количество записей для каждого издателя.
Использование лямбда-функций в .groupby()
Кроме стандартных функций агрегации, мы можем использовать лямбда-функции для дополнительной обработки данных в группировке. Возьмем поле “Title” и найдем журналы с наибольшим количеством слов в заголовке.
Результат:
ID | |
---|---|
False | 109 |
True | 3891 |
Таким образом, мы разделяем заголовки на слова с использованием лямбда-функции и группируем записи на основе длины заголовка. Затем выводим количество записей для каждой группы.
Улучшение производительности .groupby()
При работе с большими наборами данных производительность операции .groupby()
может быть проблемой. Однако с помощью правильных техник оптимизации производительность можно значительно улучшить.
Рассмотрим следующий пример:
Мы можем значительно улучшить производительность этой операции, сократив лишние шаги:
pandas GroupBy: все объединено
Итак, мы рассмотрели три примера группировки данных с использованием pandas GroupBy. Мы разобрались, как работает операция GroupBy, как использовать ее на реальных данных, в том числе данных о Конгрессе США, качества воздуха и новостного агрегатора. Мы также рассмотрели некоторые дополнительные функции и техники оптимизации производительности операции GroupBy.
Заключение
В этом туториале мы изучили различные аспекты операции pandas GroupBy, такие как группировка данных, использование функций агрегации, разделение на группы с использованием производных массивов, ресемплирование временных рядов и дополнительная обработка с помощью лямбда-функций. Мы также рассмотрели техники оптимизации производительности для операции GroupBy.
Надеемся, что этот туториал поможет вам разобраться в операции GroupBy в pandas и применить ее в ваших проектах. Удачи в работе с данными в Python!