Основы Pandas №2 // Агрегация и группировка

Во втором уроке руководства по работе с pandas речь пойдет об агрегации (min, max, sum, count и дргуих) и группировке. Это популярные методы в аналитике и проектах data science, поэтому убедитесь, что понимаете все в деталях!

Примечание: это руководство, поэтому рекомендуется самостоятельно писать код, повторяя инструкции!

Агрегация данных — теория

Агрегация — это процесс превращения значений набора данных в одно значение. Например, у вас есть следующий набор данных…

animalwater_need
zebra100
lion350
elephant670
kangaroo200

…простейший метод агрегации для него — суммирование 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.

zoo = pd.read_csv('zoo.csv', delimiter = ',')

Теперь нужно проделать пять шагов:

  1. Посчитать количество строк (количество животных) в zoo.
  2. Посчитать общее значение water_need животных.
  3. Найти наименьшее значение water_need.
  4. И самое большое значение water_need.
  5. Наконец, среднее water_need.

Агрегация данных pandas №1: .count()

Посчитать количество животных — то же самое, что применить функцию count к набору данных zoo:

zoo.count()

функция count pandas

А что это за строки? На самом деле, функция count() считает количество значений в каждой колонке. В случае с zoo было 3 колонки, в каждой из которых по 22 значения.

Чтобы сделать вывод понятнее, можно выбрать колонку animal с помощью оператора выбора из предыдущей статьи:

zoo[['animal']].count()

В этом случае результат будет даже лучше, если написать следующим образом:

zoo.animal.count()

Также будет выбрана одна колонка, но набор данных pandas превратится в объект series (а это значит, что формат вывода будет отличаться).

функция count для колонки

Агрегация данных pandas №2: .sum()

Следуя той же логике, можно с легкостью найти сумму значений в колонке water_need с помощью:

zoo.water_need.sum()

функция sum для колонки

Просто из любопытства можно попробовать найти сумму во всех колонках:

zoo.sum()

функция sum pandas

Примечание: интересно, как .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()

Cреднее значение в колонке

zoo.water_need.median()

Медиана в колонке

Это было просто. Намного проще, чем агрегация в SQL.

Но можно усложнить все немного с помощью группировки.


Группировка в pandas

Работая аналитиком или специалистом Data Science, вы наверняка постоянно будете заниматься сегментациями. Например, хорошо знать количество необходимой воды (water_need) для всех животных (это 347,72). Но удобнее разбить это число по типу животных.

Вот упрощенная репрезентация того, как pandas осуществляет «сегментацию» (группировку и агрегацию) на основе значений колонок!

Функция .groupby в действии

Проделаем эту же группировку с DataFrame zoo.

Между переменной zoo и функцией .mean() нужно вставить ключевое слово groupby:

zoo.groupby('animal').mean()

Группировка данных в pandas

Как и раньше, 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()).

Какой источник используется в article_read чаще остальных

Также можно удалить ненужные колонки и сохранить только 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

Вот краткое объяснение:

В первую очередь отфильтровали пользователей из country_2 (article_read[article_read.country == 'country_2']). Затем для этого подмножества был использован метод groupby. (Да, группировку можно осуществлять для нескольких колонок. Для этого их названия нужно собрать в список. Поэтому квадратные скобки используются между круглыми. Это что касается части groupby(['source', 'topic'])).

А функция count() — заключительный элемент пазла.

Итого

Это была вторая часть руководства по работе с pandas. Теперь вы знаете, что агрегация и группировка в pandas— это простые операции, а использовать их придется часто.


Примечание: если вы ранее пользовались SQL, сделайте перерыв и сравните методы агрегации в SQL и pandas. Так лучше станет понятна разница между языками.

В следующем материале вы узнаете о четырех распространенных методах форматирования данных: merge, sort, reset_index и fillna.

Максим
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Мои контакты: Почта
admin@pythonru.comAlex Zabrodin2018-10-26OnlinePython, Programming, HTML, CSS, JavaScript