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

wen python案例 2

本文目录导读:

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

  1. 基础数据准备
  2. 基础分组操作
  3. 数据重分层(重新分组)
  4. 高级重分层技巧
  5. 实际应用案例:销售数据分析
  6. 实用技巧汇总

我来详细介绍如何使用Pandas进行数据分组和重分层(重新分组)的案例。

基础数据准备

import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
    'city': ['北京', '北京', '上海', '上海', '广州', '广州', '深圳', '深圳'],
    'category': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
    'sales': [100, 150, 200, 180, 120, 160, 190, 210],
    'profit': [20, 30, 40, 35, 25, 32, 38, 42]
})
print("原始数据:")
print(df)

基础分组操作

# 按单个列分组
grouped_single = df.groupby('city')['sales'].sum()
print("按城市分组统计销售额合计:")
print(grouped_single)
# 按多个列分组
grouped_multi = df.groupby(['city', 'category'])['sales'].sum()
print("\n按城市和类别分组:")
print(grouped_multi)
# 多维度聚合
agg_result = df.groupby('city').agg({
    'sales': ['sum', 'mean', 'max'],
    'profit': ['sum', 'mean']
})
print("\n多维度聚合结果:")
print(agg_result)

数据重分层(重新分组)

# 创建分层数据
multi_index_df = pd.DataFrame({
    'region': ['华北', '华北', '华东', '华东', '华南', '华南'],
    'city': ['北京', '天津', '上海', '杭州', '广州', '深圳'],
    'sales_2023': [1000, 800, 1200, 900, 1100, 950],
    'sales_2024': [1100, 850, 1300, 950, 1150, 1000]
}).set_index(['region', 'city'])
print("原始分层数据:")
print(multi_index_df)
# 方法1: 使用groupby重新分组
re_grouped = multi_index_df.groupby(level='region').sum()
print("\n按地区重新分组求和:")
print(re_grouped)
# 方法2: 使用stack/unstack进行重分层
unstacked = multi_index_df.unstack(level='city')
print("\n将城市转换为列:")
print(unstacked)
# 方法3: 使用pivot_table创建新分组
pivot_result = pd.pivot_table(
    multi_index_df.reset_index(),
    values='sales_2024',
    index='region',
    columns='city',
    aggfunc='sum'
)
print("\n使用数据透视表重新分组:")
print(pivot_result)

高级重分层技巧

# 创建更复杂的数据
complex_df = pd.DataFrame({
    'date': pd.date_range('2024-01-01', periods=12, freq='M'),
    'region': ['华北', '华东', '华南'] * 4,
    'product': ['A', 'B', 'C'] * 4,
    'sales': np.random.randint(100, 500, 12),
    'quantity': np.random.randint(10, 50, 12)
})
print("复杂数据示例:")
print(complex_df.head(6))
# 1. 按时间周期重分层
complex_df['quarter'] = complex_df['date'].dt.quarter
complex_df['year_month'] = complex_df['date'].dt.strftime('%Y-%m')
quarterly_group = complex_df.groupby(['region', 'quarter']).agg({
    'sales': 'sum',
    'quantity': 'sum'
})
print("\n按季度和地区重分层:")
print(quarterly_group)
# 2. 自定义分组函数重分层
def sales_category(x):
    if x > 300:
        return '高销售额'
    elif x > 200:
        return '中销售额'
    else:
        return '低销售额'
complex_df['sales_level'] = complex_df['sales'].apply(sales_category)
level_group = complex_df.groupby(['region', 'sales_level']).size()
print("\n按销售额级别重分层:")
print(level_group)
# 3. 使用cut进行数值分段
complex_df['sales_bins'] = pd.cut(complex_df['sales'], 
                                   bins=[0, 200, 300, 400, 500],
                                   labels=['低', '中低', '中高', '高'])
bins_group = complex_df.groupby(['region', 'sales_bins'])['quantity'].sum()
print("\n使用cut分段后重分层:")
print(bins_group)

实际应用案例:销售数据分析

# 生成模拟销售数据
np.random.seed(42)
sales_data = pd.DataFrame({
    'date': pd.date_range('2024-01-01', periods=100, freq='D'),
    'store': np.random.choice(['Store_A', 'Store_B', 'Store_C'], 100),
    'category': np.random.choice(['Electronics', 'Clothing', 'Food'], 100),
    'sales': np.random.randint(50, 500, 100),
    'customers': np.random.randint(5, 50, 100)
})
print("销售数据前5行:")
print(sales_data.head())
# 应用:按门店和类别进行多层级分析
result = sales_data.groupby(['store', 'category']).agg({
    'sales': ['sum', 'mean', 'count'],
    'customers': 'sum'
}).round(2)
print("\n门店-类别层级分析:")
print(result)
# 应用:时间序列重分层
sales_data['week'] = sales_data['date'].dt.isocalendar().week
sales_data['day_of_week'] = sales_data['date'].dt.day_name()
weekly_analysis = sales_data.groupby(['store', 'week']).agg({
    'sales': 'sum',
    'customers': 'mean'
})
print("\n周度门店分析(前10行):")
print(weekly_analysis.head(10))

实用技巧汇总

# 1. 重置索引并保留分组层级
grouped = df.groupby(['city', 'category']).sum()
reset_grouped = grouped.reset_index()
print("重置索引后:")
print(reset_grouped)
# 2. 使用多个聚合函数
agg_functions = {
    'sales': ['sum', 'mean', 'std'],
    'profit': ['sum', 'mean', 'max']
}
multi_agg = df.groupby('city').agg(agg_functions)
print("\n多聚合函数结果:")
print(multi_agg)
# 3. 自定义聚合函数
def range_func(x):
    return x.max() - x.min()
custom_agg = df.groupby('city').agg({
    'sales': ['sum', range_func],
    'profit': ['mean', range_func]
})
print("\n自定义聚合函数:")
print(custom_agg)
# 4. 分层数据的合并
hierarchical1 = df.set_index(['city', 'category'])
hierarchical2 = pd.DataFrame({
    ('北京', 'A'): {'target': 200},
    ('北京', 'B'): {'target': 250},
    ('上海', 'A'): {'target': 300}
})
print("\n分层数据结构示例:")
print(hierarchical1)
  1. groupby:最基础的分组工具
  2. pivot_table:适合创建新的分层结构
  3. stack/unstack:在行列之间转换分层
  4. cut/qcut:数值分段重分层
  5. 自定义函数:灵活的重分层逻辑

这些技巧在实际数据分析中非常实用,可以根据具体需求灵活组合使用。

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