Во втором уроке руководства по работе с pandas речь пойдет об агрегации (min, max, sum, count и дргуих) и группировке. Это популярные методы в аналитике и проектах data science, поэтому убедитесь, что понимаете все в деталях!
Примечание: это руководство, поэтому рекомендуется самостоятельно писать код, повторяя инструкции!
Агрегация данных — теория
Агрегация — это процесс превращения значений набора данных в одно значение. Например, у вас есть следующий набор данных…
animal | water_need |
---|---|
zebra | 100 |
lion | 350 |
elephant | 670 |
kangaroo | 200 |
…простейший метод агрегации для него — суммирование water_needs
, то есть 100 + 350 + 670 + 200 = 1320. Как вариант, можно посчитать количество животных — 4. Теория не так сложна. Но пора переходить к практике.
Агрегация данных — практика
Где мы остановились в последний раз? Открыли Jupyter Notebook, импортировали pandas и numpy и загрузили два набора данных: zoo.csv
и article_reads
. Продолжим с этого же места. Если вы не прошли первую часть, вернитесь и начните с нее.
Начнем с набора zoo
. Он был загружен следующим образом:
pd.read_csv('zoo.csv', delimiter = ',')
Дальше сохраним набор данных в переменную zoo
.
zoo = pd.read_csv('zoo.csv', delimiter = ',')
Теперь нужно проделать пять шагов:
- Посчитать количество строк (количество животных) в
zoo
. - Посчитать общее значение
water_need
животных. - Найти наименьшее значение
water_need
. - И самое большое значение
water_need
. - Наконец, среднее
water_need
.
Агрегация данных pandas №1: .count()
Посчитать количество животных — то же самое, что применить функцию count
к набору данных zoo
:
zoo.count()
А что это за строки? На самом деле, функция count()
считает количество значений в каждой колонке. В случае с zoo
было 3 колонки, в каждой из которых по 22 значения.
Чтобы сделать вывод понятнее, можно выбрать колонку animal
с помощью оператора выбора из предыдущей статьи:
zoo[['animal']].count()
В этом случае результат будет даже лучше, если написать следующим образом:
zoo.animal.count()
Также будет выбрана одна колонка, но набор данных pandas превратится в объект series (а это значит, что формат вывода будет отличаться).
Агрегация данных pandas №2: .sum()
Следуя той же логике, можно с легкостью найти сумму значений в колонке water_need
с помощью:
zoo.water_need.sum()
Просто из любопытства можно попробовать найти сумму во всех колонках:
zoo.sum()
Примечание: интересно, как
.sum()
превращает слова из колонкиanimal
в строку названий животных. (Кстати, это соответствует всей логике языка Python).
Агрегация данных pandas №3 и №4: .min() и .max()
Какое наименьшее значение в колонке water_need
? Определить это несложно:
zoo.water_need.min()
То же и с максимальным значением:
zoo.water_need.max()
Агрегация данных pandas №5 и №6: .mean() и .median()
Наконец, стоит посчитать среднестатистические показатели, например среднее и медиану:
zoo.water_need.mean()
zoo.water_need.median()
Это было просто. Намного проще, чем агрегация в SQL.
Но можно усложнить все немного с помощью группировки.
Группировка в pandas
Работая аналитиком или специалистом Data Science, вы наверняка постоянно будете заниматься сегментациями. Например, хорошо знать количество необходимой воды (water_need
) для всех животных (это 347,72
). Но удобнее разбить это число по типу животных.
Вот упрощенная репрезентация того, как pandas осуществляет «сегментацию» (группировку и агрегацию) на основе значений колонок!
Функция .groupby в действии
Проделаем эту же группировку с DataFrame zoo
.
Между переменной zoo
и функцией .mean()
нужно вставить ключевое слово groupby
:
zoo.groupby('animal').mean()
Как и раньше, pandas автоматически проведет расчеты .mean()
для оставшихся колонок (колонка animal
пропала, потому что по ней проводилась группировка). Можно или игнорировать колонку uniq_id
или удалить ее одним из следующих способов:
zoo.groupby('animal').mean()[['water_need']]
— возвращает объект DataFrame.
zoo.groupby('animal').mean().water_need
— возвращает объект Series.
Можно поменять метод агрегации с .mean()
на любой изученный до этого.
Пришло время…
Проверить себя №1
Вернемся к набору данных article_read
.
Примечание: стоит напомнить, что в этом наборе хранятся данные из блога о путешествиях. Скачать его можно отсюда. Пошаговый процесс загрузки, открытия и сохранения есть в прошлом материале руководства.
Если все готово, вот первое задание:
Какой источник используется в article_read
чаще остальных?
.
.
.
.
.
.
Правильный ответ:
Reddit!
Получить его можно было с помощью кода:
article_read.groupby('source').count()
Взять набор данных article_read
, создать сегменты по значениям колонки source
(groupby('source')
) и в конце концов посчитать значения по источникам (.count()
).
Также можно удалить ненужные колонки и сохранить только user_id
:
article_read.groupby('source').count()[['user_id']]
Проверить себя №2
Вот еще одна, более сложная задача:
Какие самые популярные источник и страна для пользователей country_2
? Другими словами, какая тема из какого источника принесла больше всего просмотров из country_2
?
.
.
.
.
.
.
Правильный ответ: Reddit (источник) и Азия (тема) с 139 прочтениями.
Вот Python-код для получения результата:
article_read[article_read.country == 'country_2'].groupby(['source', 'topic']).count()
Вот краткое объяснение:
В первую очередь отфильтровали пользователей из country_2
(article_read[article_read.country == 'country_2']
). Затем для этого подмножества был использован метод groupby
. (Да, группировку можно осуществлять для нескольких колонок. Для этого их названия нужно собрать в список. Поэтому квадратные скобки используются между круглыми. Это что касается части groupby(['source', 'topic'])
).
А функция count()
— заключительный элемент пазла.
Итого
Это была вторая часть руководства по работе с pandas. Теперь вы знаете, что агрегация и группировка в pandas— это простые операции, а использовать их придется часто.
Примечание: если вы ранее пользовались SQL, сделайте перерыв и сравните методы агрегации в SQL и pandas. Так лучше станет понятна разница между языками.
В следующем материале вы узнаете о четырех распространенных методах форматирования данных: merge
, sort
, reset_index
и fillna
.