Python案例如何用Pandas做数据分组重采重构

wen python案例 7

本文目录导读:

Python案例如何用Pandas做数据分组重采重构

  1. 数据准备
  2. 数据分组操作
  3. 数据重采样
  4. 数据重构操作
  5. 综合案例:销售数据分析
  6. 实用技巧
  7. 性能优化建议

我来详细讲解如何使用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中数据分组、重采样和重构的核心操作,适用于数据分析、时间序列处理、报表生成等场景。

抱歉,评论功能暂时关闭!