Группировка данных и агрегация — ключевые этапы анализа данных. Они позволяют извлекать ценную информацию из больших объемов данных и принимать обоснованные решения. Поговорим о более продвинутых методах группировки данных в Python, а именно о функциях transform()
и filter()
. Рассмотрим, как эти методы могут быть использованы для обогащения и фильтрации данных внутри групп.
Метод transform()
в библиотеке Pandas позволяет применять функцию к каждой группе данных и возвращать результат той же длины, что и исходный набор данных. Это полезно, когда вы хотите добавить агрегированные данные в исходный DataFrame.
Давайте рассмотрим простой пример. У нас есть данные о продажах товаров в разных категориях:
import pandas as pd
data = {
'Category': ['A', 'B', 'A', 'B', 'A'],
'Sales': [100, 150, 200, 250, 300]
}
df = pd.DataFrame(data)
Мы хотим добавить новый столбец с суммой продаж для каждой категории. Это можно сделать с помощью метода transform()
:
df['Total_Sales'] = df.groupby('Category')['Sales'].transform('sum')
print(df)
# Category Sales Total_Sales
# 0 A 100 600
# 1 B 150 400
# 2 A 200 600
# 3 B 250 400
# 4 A 300 600
Теперь в DataFrame появился новый столбец Total_Sales
, содержащий сумму продаж по каждой категории.
Пример 1: Нормализация данных
Нормализация данных - это процесс масштабирования данных, чтобы они находились в определенном диапазоне. Например, давайте нормализуем данные по продажам внутри каждой категории, чтобы они находились в диапазоне от 0 до 1:
df['Normalized_Sales'] = df.groupby('Category')['Sales'].transform(lambda x: (x - x.min()) / (x.max() - x.min()))
print(df)
# Category Sales Normalized_Sales
# 0 A 100 0.0
# 1 B 150 0.0
# 2 A 200 0.5
# 3 B 250 1.0
# 4 A 300 1.0
В этом примере мы применяем лямбда-функцию к каждой группе данных, которая выполняет нормализацию. Теперь у нас есть новый столбец Normalized_Sales
, содержащий нормализованные значения продаж.
Пример 2: Добавление статистики по группам
Иногда требуется добавить статистические данные по каждой группе. Например, давайте добавим среднее значение продаж для каждой категории:
df['Mean_Sales'] = df.groupby('Category')['Sales'].transform('mean')
print(df)
# Category Sales Mean_Sales
# 0 A 100 200.0
# 1 B 150 200.0
# 2 A 200 200.0
# 3 B 250 200.0
# 4 A 300 200.0
Теперь в DataFrame есть новый столбец Mean_Sales
, который содержит средние значения продаж для каждой категории.
Пример 3: Динамическое добавление новых столбцов
Вы также можете динамически добавлять новые столбцы в зависимости от результата transform()
. Например, вы хотите добавить столбцы, содержащие сумму и среднее значение продаж для каждой категории:
agg_funcs = {
'Sales': ['sum', 'mean']
}
df = df.join(df.groupby('Category')['Sales'].transform(agg_funcs), rsuffix='_Category')
В этом примере мы определяем словарь agg_funcs
, который содержит функции для агрегации данных, и затем добавляем новые столбцы к DataFrame с помощью метода join()
.
Метод filter()
позволяет фильтровать группы данных в зависимости от заданного условия. Это полезно, когда вы хотите извлечь только определенные группы, удовлетворяющие определенным критериям.
Давайте рассмотрим пример. У нас есть данные о продажах товаров в разных категориях, и мы хотим извлечь только те категории, в которых сумма продаж больше 250:
filtered_categories = df.groupby('Category').filter(lambda x: x['Sales'].sum() > 250)
В результате мы получим новый DataFrame, содержащий только категории с суммой продаж больше 250.
Пример 1: Фильтрация по стандартному отклонению
Иногда вам может потребоваться фильтровать данные по стандартному отклонению. Например, давайте извлечем только те категории, у которых стандартное отклонение продаж больше 50:
filtered_categories = df.groupby('Category').filter(lambda x: x['Sales'].std() > 50)
Теперь у нас есть новый DataFrame, содержащий только категории с большим стандартным отклонением продаж.
Пример 2: Фильтрация по количеству элементов в группе
Вы также можете фильтровать данные по количеству элементов в группе. Например, давайте извлечем только те категории, в которых есть более трех продуктов:
filtered_categories = df.groupby('Category').filter(lambda x: len(x) > 3)
Теперь у нас есть новый DataFrame, содержащий только категории с более чем тремя продуктами.
Помимо основ использования функций transform()
и filter()
, существуют дополнительные советы и практические примеры, которые могут помочь вам более продуктивно работать с этими методами.
Вы можете определять собственные функции для агрегации данных и использовать их с методом transform()
. Например, давайте определим функцию для нахождения разницы между максимальным и минимальным значением продаж в каждой категории:
def sales_range(x):
return x.max() - x.min()
df['Sales_Range'] = df.groupby('Category')['Sales'].transform(sales_range)
Теперь у нас есть новый столбец Sales_Range
, содержащий разницу между максимальным и минимальным значением продаж в каждой категории.
Вы можете использовать разные функции при transform()
для разных столбцов. Например, давайте найдем среднее значение продаж и медиану для каждой категории:
agg_funcs = {
'Sales': 'mean',
'Profit': 'median'
}
df = df.join(df.groupby('Category').transform(agg_funcs), rsuffix='_Category')
Теперь в DataFrame есть два новых столбца, Sales_mean_Category
и Profit_median_Category
, содержащих соответствующие агрегированные значения для каждой категории.
Иногда бывает полезно совмещать transform()
и filter()
. Например, вы хотите извлечь только те продукты, у которых средние продажи выше среднего по всем категориям:
mean_sales_by_category = df.groupby('Category')['Sales'].transform('mean')
filtered_data = df.groupby('Category').filter(lambda x: (x['Sales'].mean() > mean_sales_by_category.mean()))
Этот код сначала вычисляет среднее значение продаж по каждой категории с помощью transform()
, а затем фильтрует данные, оставляя только те категории, у которых средние продажи выше среднего по всем категориям.
После применения transform()
, индекс в исходном DataFrame остается неизменным. Если вам необходимо сбросить индекс, вы можете использовать метод reset_index()
:
df = df.reset_index(drop=True)
Это сбросит индекс, и вы получите DataFrame с новым индексом без сохранения старого.
Использование функций transform()
и filter()
при группировке данных в Pandas позволяет сделать анализ данных более мощным и гибким. Вы можете добавлять новые столбцы с агрегированными данными, выполнять нормализацию, фильтровать данные и многое другое.
Содержание: