Подробно объясните механизм groupby в Pandas.

искусственный интеллект анализ данных

Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер

Всем привет, меня зовут Питер~

В моей ежедневной обработке и анализе данных я часто сталкиваюсь с необходимостью других операций, таких как группировка и суммирование или усреднение определенного поля данных.Различные источники пользователей проводят сегментацию пользовательского портрета для изучения предпочтений и потребления разных групп пользователей.

В пандах я использую groupby для решения таких проблем.Эта статья объединяет смоделированные данные для объяснения внутреннего механизма groupby.

Портал:Tickets.WeChat.QQ.com/Yes?__Author=mz i…

Данные моделирования

Для удобства пояснения я смоделировал фиктивные данные, содержащие всего 3 поля: ФИО сотрудников, зарплата, оклад, балл.

import pandas as pd
import numpy as np

employees = ["小明","小周","小孙"]   # 3位员工

df=pd.DataFrame({
    "employees":[employees[x] for x in np.random.randint(0,len(employees),9)],  # 在员工中重复选择9个人
    "salary":np.random.randint(800,1000,9),  # 800-1000之间的薪资选择9个数值
    "score":np.random.randint(6,11,9)  # 6-11的分数选择9个
})

df

Объект DataFrameGroupBy

Внутренняя ситуация

Теперь мы выполняем группировку groupby по сотрудникам и получаем объект DataFrameGroupBy

# groupbying = df.groupby("employees")  by可以省略

groupbying = df.groupby(by="employees")
groupbying

Так как же выглядит этот объект DataFrameGroupBy? Давайте расширим его списком, чтобы увидеть:

# 查看对象内部的情况

list(groupbying)

Наконец-то мы видим загадочное лицо этого объекта:

  • Объект представляет собой большой список, содержащий 3 элемента, каждый из которых имеет объект кортежа: [tuple1,tuple2,tuple3]
  • Элементы сгруппированы в соответствии с нашими назначенными сотрудниками: вся информация о данных Сяочжоу, Сяосун и Сяомин соответственно.

Давайте взглянем на конкретную информацию о Сяомине: мы находим, что сяомин — это кортеж, а затем смотрим на конкретную информацию после преобразования ее в список:

Мы обнаружили, что первая информация после преобразования кортежа в список — это имя сотрудника группы, а вторая — небольшой фрейм данных DataFrame, состоящий из всей информации о сотруднике.

На следующем рисунке хорошо показано внутреннее устройство объекта DataFrameGroupBy:

Резюме: Когда мы группируем по групповому механизму в соответствии с полем, то, сколько суб-DataFrames может быть сгенерировано в конце, зависит от того, сколько различных элементов есть в нашем поле (в данном случае их 3); после того, как мы сгруппируем, мы может отслеживать различные операции агрегирования, такие как сумма, среднее значение, минимум и т. д.

Обход объекта DataFrameGroupBy

for name,group in groupbying:  # 遍历.DataFrameGroupBy对象
    print(name)
    print(group)

выберите группу get_group()

Использование метода get_group() для объекта DataFrameGroupBy позволяет нам получить данные для указанной группы в сгруппированном элементе:

Используйте разные агрегатные функции для одного и того же имени столбца

После группировки используйте разные функции для одного и того же имени столбца.Функции представлены в виде списка: следующее ? указывает сумму, максимум, минимум, среднее значение и размер баллов соответственно.

df9 = df.groupby("employees")["score"].agg(["sum","max","min","mean","size"]).reset_index()
df9

Агрегатная функция

Я уверен, что многие из моих друзей знакомы с агрегатными операциями или агрегатными функциями.На SQL мы можем написать:

select
	name  -- 姓名
	,sum(score)  -- 分数最大值
	,avg(score)  --  平均值
from score
group by name  -- 根据学生姓名分组统计

В приведенном выше операторе SQL sum и avg являются общими операциями агрегирования.Операции агрегирования, обычно используемые в пандах, классифицируются и сортируются:

функция значение
min/max Мин Макс
sum сумма
mean значит
median медиана
std среднеквадратичное отклонение
var дисперсия
count считать статистику

В дополнение к вышеперечисленным функциям агрегации мы также можем использовать методы библиотеки numpy, такие как unique (разные элементы), nunique (количество разных элементов, количество — это вся статистика) и т. д. Нижеследующее будет объединено с практическими примеры для иллюстрации.

операция агрегирования

Операция агрегирования выполняется с помощью agg, и вы можете указать столбец или несколько столбцов, чтобы использовать различные функции агрегирования для агрегирования.

1. Выполняем операции агрегирования по одному столбцу, например: мы хотим просуммировать столбец зарплаты:

# df.groupby("employees")["salary"].sum  
# 如果只是单个元素,上下两种写法等价
df.groupby("employees").agg({"salary":"sum"})

В общем, результатом является фрейм данных с полем группировки в качестве индекса строки, тогда, если мы также хотим превратить этот индекс строки в атрибут имени столбца во фрейме данных, используйте reset_index для завершения:

Строка кода записывается так:

2. Используйте разные функции агрегирования для нескольких столбцов, например: мы хотим суммировать зарплату, средний балл и использовать пары полей для достижения

salary_score = df.groupby("employees").agg({"salary":"sum",
                                            "score":"mean"
                                           })
salary_score

Точно так же мы можем заставить работать сброс индекса:

Однако после сброса мы не можем видеть конкретную функцию агрегации. Рассмотрите возможность изменения следующих имен для сгенерированного фрейма данных. Новое имя может быть указано произвольно в соответствии с вашими предпочтениями. Как правило, оно должно отражать значение имя столбца:

⚠️Высокая энергия впереди: используйте одну строку кода, чтобы реализовать весь описанный выше процесс:

df.groupby("employees").agg({"salary":"sum","score":"mean"}).reset_index().rename(columns={"salary":"salary_sum","score":"score_mean"})

Подробно объясните функции каждой функции приведенной выше строки кода:

  1. groupby: указывает поле имени столбца группировки
  2. agg: укажите имя столбца и агрегатную функцию, которую вы хотите реализовать.
  3. reset_index: сбросить индекс сгенерированного фрейма данных
  4. переименовать: изменить сгенерированное имя столбца; указанное выше указано вручную, и все они должны быть перечислены; переименование может переименовать имя столбца, которое мы хотим изменить

На следующем графике хорошо показан процесс перехода от необработанных данных к объекту DataFrameGroupBy и, наконец, к агрегированию нескольких имен столбцов:

Подсчитайте количество различных имен столбцов

В этом требовании мы используем метод nunqiue в numpy, учитывая требование: мы хотим подсчитать разные баллы каждого сотрудника и соответствующее число. Фактический результат должен быть:

1. Подсчитайте разные баллы каждого сотрудника: использован уникальный метод

df.groupby("employees").agg({"score":"unique"}).reset_index()

2. Подсчитайте количество различных баллов для каждого сотрудника: используйте метод nuique

Почему именно эти два метода объясняются здесь? Потому что оно встречается в ваших реальных потребностях и симулирует ваши собственные потребности. Например, задан набор данных, включающий номер заказа, модель, производителя в заказе мобильного телефона.

Теперь необходимо подсчитать количество заказов, название производителя (дедупликация) и количество производителей (дедупликация), соответствующих каждой модели. В настоящее время для выполнения этого требования можно использовать описанный выше метод, и конечный результат должен быть таким:

1. Сначала создайте данные, связанные с количеством заказов и названием производителя:

2. Восстановить данные о количестве производителей:

3. Слить данные через функцию слияния в пандах:

Можно видеть, что следующие данные согласуются с фактическими результатами.

Одна строка кода также может удовлетворить вышеуказанные требования: одновременно использовать две разные функции для столбца производителя, одна — статистическое имя, другая — статистическое число, а результатом является мультииндексный фрейм данных.

df4.groupby("型号").agg({"订单号":"count","厂家":["unique","nunique"]}).reset_index()

функция преобразования

Какую проблему решает метод преобразования? Чем он отличается от агг? Мы начинаем с фактического нового требования. Например, мы хотим добавить столбец в конце данных, который представляет средний балл каждого сотрудника. Данные станут следующими, и зеленая часть — это наша потребность:

Хороший метод: вышеуказанные требования могут быть легко достигнуты с помощью преобразования

df["score_mean"] = df.groupby("employees")["score"].transform("mean")  # transform后面指定需要聚合的函数
df

Как выполнить вышеуказанные требования без преобразования? Во-первых, мы по-прежнему генерируем средний балл для каждого сотрудника, который представляется в виде словаря.

Затем мы используем карту для сопоставления сотрудников:

df["score_avg"] = df["employees"].map(avg_score)  # 每位员工和平均值进行匹配

В чем разница между преобразованием и агг?

Суммируйте разницу между ними:

  1. Transform — это добавление новых столбцов к исходным данным, а agg — создание нового фрейма данных на основе группирующих полей и функций агрегирования.
  2. Данные преобразования заносятся в каждый столбец объекта группировки, а gg просто генерирует окончательный результат агрегирования.

Суммировать

В реальной обработке данных и статистической работе очень распространенными требованиями являются группировка статистического суммирования, среднее значение, число и т. д. В этой статье объясняется механизм группировки внутри панд и то, как агрегировать функции на основе практических примеров, надеюсь, она будет полезна читателям. .