本文目录导读:

我将为您展示如何使用Pandas进行数据分组重采样,这里提供几个实际案例:
基础时间序列重采样
import pandas as pd
import numpy as np
from datetime import datetime
# 创建示例数据
dates = pd.date_range('2024-01-01', periods=1000, freq='H')
df = pd.DataFrame({
'date': dates,
'category': np.random.choice(['A', 'B', 'C'], 1000),
'value': np.random.randn(1000) * 100
})
print("原始数据前5行:")
print(df.head())
print("\n原始数据形状:", df.shape)
按类别分组后重采样
# 设置日期为索引
df = df.set_index('date')
# 按category分组后,按天重采样求平均值
result_daily = df.groupby('category').resample('D')['value'].agg(['mean', 'std', 'count'])
print("\n按天重采样结果:")
print(result_daily.head(10))
不同频率重采样示例
# 按周重采样
weekly_result = df.groupby('category').resample('W')['value'].agg(['mean', 'sum', 'count'])
print("\n按周重采样结果:")
print(weekly_result.head(10))
# 按月重采样
monthly_result = df.groupby('category').resample('M')['value'].agg(['mean', 'min', 'max'])
print("\n按月重采样结果:")
print(monthly_result.head(10))
实际业务案例 - 销售数据分析
# 创建销售数据示例
import random
dates = pd.date_range('2024-01-01', periods=365, freq='D')
sales_data = pd.DataFrame({
'date': np.random.choice(dates, 2000),
'product': np.random.choice(['手机', '电脑', '平板', '耳机'], 2000),
'region': np.random.choice(['华东', '华南', '华北', '西南'], 2000),
'sales': np.random.randint(100, 10000, 2000),
'quantity': np.random.randint(1, 50, 2000)
})
print("\n销售数据前5行:")
print(sales_data.head())
# 设置日期索引
sales_data = sales_data.set_index('date')
# 1. 按产品和地区分组,按月统计销售额和数量
monthly_sales = sales_data.groupby(['product', 'region']).resample('M').agg({
'sales': ['sum', 'mean'],
'quantity': ['sum', 'mean']
})
print("\n按月统计各产品各地区销售情况:")
print(monthly_sales.head(20))
多维度分组重采样
# 按产品分组,按周重采样,使用不同聚合函数
weekly_stats = sales_data.groupby('product').resample('W').agg({
'sales': ['sum', 'mean', 'std'],
'quantity': ['sum', 'median']
})
print("\n按周统计各产品销售情况:")
print(weekly_stats.head(20))
# 按地区分组,按季度重采样
quarterly_stats = sales_data.groupby('region').resample('Q').agg({
'sales': ['sum', 'mean', 'max'],
'quantity': ['sum', 'mean']
})
print("\n按季度统计各地区销售情况:")
print(quarterly_stats.head(20))
自定义聚合函数示例
# 自定义聚合函数
def sales_growth_rate(group):
"""计算销售增长率"""
if len(group) > 1:
first_val = group.iloc[0]
last_val = group.iloc[-1]
return (last_val - first_val) / first_val * 100
return 0
# 按月计算各产品增长率
monthly_growth = sales_data.groupby('product').resample('M')['sales'].agg([
('total_sales', 'sum'),
('avg_daily_sales', 'mean'),
('max_sales', 'max'),
('min_sales', 'min'),
('growth_rate', sales_growth_rate)
])
print("\n各产品月度销售增长率:")
print(monthly_growth.head(10))
条件筛选后重采样
# 筛选特定产品后进行重采样
phone_data = sales_data[sales_data['product'] == '手机']
phone_weekly = phone_data.groupby('region').resample('W')['sales'].sum().unstack()
print("\n手机在各地区周销售额:")
print(phone_weekly.head())
重采样参数详解
# 准备示例数据
index = pd.date_range('2024-01-01', periods=50, freq='H')
data = pd.DataFrame({
'group': ['A']*20 + ['B']*20 + ['C']*10,
'value': np.random.randn(50) * 10
}, index=index)
print("\n重采样参数示例:")
print("-" * 50)
# 不同的重采样频率
frequencies = ['H', 'D', 'W', 'M', 'Q', 'Y']
for freq in frequencies:
result = data.groupby('group').resample(freq)['value'].agg(['count', 'mean'])
print(f"\n频率: {freq}")
print(result.head())
# 不同的聚合方法
methods = ['sum', 'mean', 'max', 'min', 'std', 'var', 'median']
for method in methods:
result = data.groupby('group').resample('D')['value'].agg(method)
print(f"\n聚合方法: {method}")
print(result.head())
实际应用 - 温度数据分析
# 创建温度数据示例
dates = pd.date_range('2024-01-01', periods=1000, freq='H')
temp_data = pd.DataFrame({
'date': dates,
'city': np.random.choice(['北京', '上海', '广州', '深圳'], 1000),
'temperature': np.random.uniform(15, 35, 1000),
'humidity': np.random.uniform(40, 80, 1000)
})
temp_data = temp_data.set_index('date')
print("\n温度数据前5行:")
print(temp_data.head())
# 按城市分组,按天计算日均温和湿度
daily_weather = temp_data.groupby('city').resample('D').agg({
'temperature': ['mean', 'max', 'min'],
'humidity': ['mean', 'max', 'min']
})
print("\n各城市每日天气统计:")
print(daily_weather.head(15))
# 按月统计各城市平均温度趋势
monthly_trend = temp_data.groupby('city').resample('M')['temperature'].agg(['mean', 'std'])
print("\n各城市月均温度:")
print(monthly_trend)
关键知识点总结:
- 基本语法:
df.groupby('group').resample('freq').agg() - 常用频率参数:
- 'D': 天
- 'W': 周
- 'M': 月
- 'Q': 季度
- 'Y': 年
- 'H': 小时
- 常用聚合函数:sum, mean, max, min, std, count
- 数据要求:日期列必须是索引(DatetimeIndex)
- 分组优先级:先分组再重采样
这些案例涵盖了数据分组重采样的主要应用场景,您可以根据实际需求进行调整和使用。