本文目录导读:

我来详细讲解如何使用Pandas进行数据分组、重采样和重构操作。
数据准备
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# 创建示例数据
np.random.seed(42)
# 创建时间序列数据
dates = pd.date_range('2023-01-01', periods=100, freq='H')
categories = ['A', 'B', 'C']
data = {
'date': np.random.choice(dates, 500),
'category': np.random.choice(categories, 500),
'value': np.random.randn(500) * 100,
'quantity': np.random.randint(1, 100, 500)
}
df = pd.DataFrame(data)
df.head()
数据分组操作
基本分组
# 按类别分组,计算平均值
grouped_mean = df.groupby('category')['value'].mean()
print("按类别分组平均值:")
print(grouped_mean)
# 多列分组
grouped_multiple = df.groupby(['category', pd.Grouper(key='date', freq='D')])['value'].agg(['mean', 'sum', 'count'])
print("\n按类别和日期分组:")
print(grouped_multiple.head())
多维度分组统计
# 分组后进行多种统计
grouped_stats = df.groupby('category').agg({
'value': ['mean', 'std', 'min', 'max'],
'quantity': ['sum', 'mean']
})
print("多维度分组统计:")
print(grouped_stats)
数据重采样
时间序列重采样
# 确保日期列是索引
df_time = df.set_index('date')
df_time = df_time.sort_index()
# 按天重采样
daily_resampled = df_time['value'].resample('D').agg(['mean', 'sum', 'count'])
print("按天重采样:")
print(daily_resampled.head())
# 按周重采样
weekly_resampled = df_time['value'].resample('W').mean()
print("\n按周重采样平均值:")
print(weekly_resampled.head())
高级重采样操作
# 多列重采样
resampled_multiple = df_time.resample('D').agg({
'value': ['mean', 'std'],
'quantity': 'sum'
})
print("多列重采样:")
print(resampled_multiple.head())
# 自定义重采样函数
def custom_resample(x):
return {
'max_minus_min': x.max() - x.min(),
'volatility': x.std() / x.mean() * 100
}
custom_resampled = df_time['value'].resample('W').apply(custom_resample)
print("\n自定义重采样:")
print(custom_resampled.head())
数据重构操作
透视表 (Pivot)
# 创建透视表
pivot_table = pd.pivot_table(
df,
values='value',
index='category',
columns=pd.Grouper(key='date', freq='M'),
aggfunc='mean',
fill_value=0
)
print("透视表 - 类别vs月份平均值:")
print(pivot_table)
# 多值透视表
pivot_multi = pd.pivot_table(
df,
values=['value', 'quantity'],
index='category',
columns=pd.Grouper(key='date', freq='Q'),
aggfunc={'value': 'mean', 'quantity': 'sum'}
)
print("\n多值透视表:")
print(pivot_multi)
堆叠和解除堆叠
# 创建一个多层索引的DataFrame
multi_df = df.groupby(['category', pd.Grouper(key='date', freq='D')])['value'].mean().unstack()
print("解除堆叠 - 类别vs日期:")
print(multi_df.head())
# 堆叠操作
stacked = multi_df.stack()
print("\n堆叠后:")
print(stacked.head(10))
综合案例:销售数据分析
# 创建销售数据
sales_data = pd.DataFrame({
'date': pd.date_range('2023-01-01', periods=365, freq='D'),
'product': np.random.choice(['产品A', '产品B', '产品C'], 365),
'region': np.random.choice(['华东', '华南', '华北', '西南'], 365),
'sales': np.random.randint(100, 1000, 365),
'quantity': np.random.randint(10, 100, 365)
})
print("销售数据预览:")
print(sales_data.head())
print(f"\n数据维度: {sales_data.shape}")
# 1. 按产品分组统计
product_stats = sales_data.groupby('product').agg({
'sales': ['sum', 'mean'],
'quantity': 'sum'
}).round(2)
print("\n按产品分组统计:")
print(product_stats)
# 2. 按地区和月份重采样
sales_data['month'] = sales_data['date'].dt.month
monthly_region = sales_data.groupby(['region', 'month']).agg({
'sales': 'sum',
'quantity': 'mean'
}).round(2)
print("\n按月地区统计:")
print(monthly_region)
# 3. 创建透视表
pivot_sales = pd.pivot_table(
sales_data,
values='sales',
index='product',
columns=['region', pd.Grouper(key='date', freq='Q')],
aggfunc='sum',
fill_value=0
)
print("\n产品销售透视表:")
print(pivot_sales)
# 4. 趋势分析
sales_data['week'] = sales_data['date'].dt.isocalendar().week
weekly_trend = sales_data.groupby(['product', 'week'])['sales'].sum().unstack()
print("\n产品周销售趋势:")
print(weekly_trend)
实用技巧
# 1. 分组后进行条件筛选
def top_n_per_group(df, n=3):
return df.groupby('category').apply(
lambda x: x.nlargest(n, 'value')
).reset_index(drop=True)
top_sales = top_n_per_group(df)
print("每个类别前3高值:")
print(top_sales.head())
# 2. 分组填充缺失值
df_with_na = df.copy()
df_with_na.loc[df_with_na.sample(50).index, 'value'] = np.nan
filled_df = df_with_na.groupby('category')['value'].transform(lambda x: x.fillna(x.mean()))
print("\n分组填充后:")
print(filled_df.head())
# 3. 分组计算百分比
percentage = df.groupby('category')['value'].sum() / df['value'].sum() * 100
print("\n各分类占比:")
print(percentage.round(2))
性能优化建议
# 1. 使用分类类型提高性能
df['category'] = df['category'].astype('category')
# 2. 使用并行计算
import swifter
# df.groupby('category')['value'].swifter.apply(lambda x: x.sum())
# 3. 避免使用apply,使用内置函数
# 不推荐
# df.groupby('category')['value'].apply(lambda x: x.mean())
# 推荐
# df.groupby('category')['value'].mean()
这些案例涵盖了Pandas中数据分组、重采样和重构的核心操作,适用于数据分析、时间序列处理、报表生成等场景。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播