Общественный номер: 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"})
Подробно объясните функции каждой функции приведенной выше строки кода:
- groupby: указывает поле имени столбца группировки
- agg: укажите имя столбца и агрегатную функцию, которую вы хотите реализовать.
- reset_index: сбросить индекс сгенерированного фрейма данных
- переименовать: изменить сгенерированное имя столбца; указанное выше указано вручную, и все они должны быть перечислены; переименование может переименовать имя столбца, которое мы хотим изменить
На следующем графике хорошо показан процесс перехода от необработанных данных к объекту 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) # 每位员工和平均值进行匹配
В чем разница между преобразованием и агг?
Суммируйте разницу между ними:
- Transform — это добавление новых столбцов к исходным данным, а agg — создание нового фрейма данных на основе группирующих полей и функций агрегирования.
- Данные преобразования заносятся в каждый столбец объекта группировки, а gg просто генерирует окончательный результат агрегирования.
Суммировать
В реальной обработке данных и статистической работе очень распространенными требованиями являются группировка статистического суммирования, среднее значение, число и т. д. В этой статье объясняется механизм группировки внутри панд и то, как агрегировать функции на основе практических примеров, надеюсь, она будет полезна читателям. .