pandas.Grouper()
在实际项目中非常有用,尤其是在处理时间序列数据、财务数据或多级索引数据时。以下是几个实际场景的例子,展示了如何使用 pandas.Grouper()
进行数据分组,并用数值示例说明。
1. 按月分组进行销售数据汇总
场景: 一个电商平台的销售数据,包含订单日期和销售额,要求按月汇总每月的总销售额。
数据示例:
import pandas as pd# 创建示例数据
data = {'order_date': ['2023-01-01', '2023-01-15', '2023-02-01', '2023-02-15', '2023-03-01', '2023-03-15'],'sales': [150, 200, 180, 220, 250, 300]
}
df = pd.DataFrame(data)
df['order_date'] = pd.to_datetime(df['order_date'])# 使用Grouper按月分组
monthly_sales = df.groupby(pd.Grouper(key='order_date', freq='ME')).sum()print(monthly_sales)
输出:
sales
order_date
2023-01-31 350
2023-02-28 400
2023-03-31 550
解释: 在这个例子中,Grouper
被用来根据 order_date
列按月进行分组,聚合函数是求和 (sum
),结果显示每个月的总销售额。
2. 按季度分组进行平均销售额分析
场景: 按季度分析某产品的平均销售额,以便做季节性销售预测。
数据示例:
# 创建示例数据
data = {'order_date': ['2023-01-01', '2023-04-01', '2023-07-01', '2023-10-01'],'sales': [120, 150, 200, 180]
}
df = pd.DataFrame(data)
df['order_date'] = pd.to_datetime(df['order_date'])# 使用Grouper按季度分组
quarterly_sales = df.groupby(pd.Grouper(key='order_date', freq='QE')).mean()print(quarterly_sales)
输出:
sales
order_date
2023-03-31 120
2023-06-30 150
2023-09-30 200
2023-12-31 180
解释: Grouper
根据 order_date
列按季度进行分组(freq='Q'
),并计算每个季度的平均销售额。季度之间的销售波动可以通过这种方式进行分析。
3. 按天分组处理时间序列数据
场景: 假设你有一个股票市场数据集,每个交易日的股票价格需要按天进行分组,计算每日的最大、最小价格。
数据示例:
# 创建示例数据
data = {'date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-03'],'price': [100, 110, 105, 107, 108]
}
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])# 按天分组并计算每一天的最大和最小股票价格
daily_prices = df.groupby(pd.Grouper(key='date', freq='D')).agg({'price': ['max', 'min']})print(daily_prices)
输出:
price max min
date
2023-01-01 110 100
2023-01-02 107 105
2023-01-03 108 108
解释: 这里我们使用 Grouper
按天 (freq='D'
) 对数据进行分组,并使用 agg
方法分别计算每一天的最大和最小股票价格。
4. 按多个层级进行分组(多级索引)
场景: 假设你有一个包含多个地区和年份的销售数据,要求按地区和年份进行分组,计算每个地区每年的总销售额。
数据示例:
# 创建示例数据
data = {'region': ['North', 'North', 'South', 'South', 'North', 'South'],'year': [2021, 2022, 2021, 2022, 2021, 2022],'sales': [100, 150, 120, 180, 200, 250]
}
df = pd.DataFrame(data)
df.set_index(['region', 'year'], inplace=True)# 使用Grouper按年份分组并计算总销售额
sales_by_region_year = df.groupby(pd.Grouper(level='year')).sum()print(sales_by_region_year)
输出:
sales
year
2021 420
2022 580
解释: 在这个例子中,Grouper
被用来按 year
进行分组。通过 level='year'
来指定我们要根据 year
这一层级来进行分组,并计算每个年份的总销售额。set_index
用来创建多级索引。
5. 按自定义时间频率分组
场景: 假设你有一个包含分钟级别时间戳的传感器数据集,要求按每小时分组进行统计。
数据示例:
# 创建示例数据
data = {'timestamp': ['2023-01-01 00:01', '2023-01-01 00:30', '2023-01-01 01:00', '2023-01-01 01:15'],'value': [10, 15, 20, 25]
}
df = pd.DataFrame(data)
df['timestamp'] = pd.to_datetime(df['timestamp'])# 按每小时分组
hourly_data = df.groupby(pd.Grouper(key='timestamp', freq='H')).sum()print(hourly_data)
输出:
value
timestamp
2023-01-01 00:00:00 25
2023-01-01 01:00:00 45
解释: 使用 freq='H'
可以按小时对数据进行分组,求出每小时的数据汇总。即使原数据的时间戳是分钟级别,Grouper
会自动按小时进行对齐并汇总。
总结:
pandas.Grouper()
可以处理各种实际问题,尤其是在时间序列数据和多层级数据的处理上,能够灵活地按不同的时间频率、层级或条件对数据进行分组,并进行各种统计分析。