Python案例如何用Pandas做数据分组迭代

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据分组迭代

  1. 基本分组迭代
  2. 多列分组迭代
  3. 分组后聚合计算
  4. 分组后处理并生成新数据
  5. 条件筛选与分组迭代
  6. 时间序列分组迭代
  7. 实战案例:销售数据多维分析
  8. 分组迭代优化技巧

我来详细介绍如何使用Pandas进行数据分组迭代,包含多个实用案例。

基本分组迭代

import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
    '部门': ['技术部', '技术部', '市场部', '市场部', '财务部', '财务部'],
    '姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
    '薪资': [15000, 18000, 12000, 16000, 20000, 22000],
    '年龄': [28, 32, 25, 30, 35, 38]
})
print("原始数据:")
print(df)
# 基本分组迭代
print("\n=== 按部门分组迭代 ===")
for name, group in df.groupby('部门'):
    print(f"\n部门: {name}")
    print(group)

多列分组迭代

# 创建多层级分组数据
df_multi = pd.DataFrame({
    '城市': ['北京', '北京', '上海', '上海', '广州', '广州'],
    '产品': ['A', 'B', 'A', 'B', 'A', 'B'],
    '销量': [100, 150, 200, 180, 120, 160],
    '金额': [10000, 15000, 20000, 18000, 12000, 16000]
})
print("多列分组数据:")
print(df_multi)
# 多列分组迭代
print("\n=== 按城市和产品分组迭代 ===")
for (city, product), group in df_multi.groupby(['城市', '产品']):
    print(f"\n城市: {city}, 产品: {product}")
    print(group)

分组后聚合计算

# 创建包含多个数值列的数据
df_sales = pd.DataFrame({
    '区域': ['华北', '华北', '华东', '华东', '华南', '华南'],
    '月份': ['1月', '2月', '1月', '2月', '1月', '2月'],
    '销售额': [50000, 60000, 70000, 65000, 55000, 72000],
    '成本': [30000, 35000, 40000, 38000, 32000, 42000],
    '利润': [20000, 25000, 30000, 27000, 23000, 30000]
})
print("销售数据:")
print(df_sales)
# 分组后进行统计计算
print("\n=== 按区域分组进行统计 ===")
for name, group in df_sales.groupby('区域'):
    print(f"\n区域: {name}")
    print(f"平均销售额: {group['销售额'].mean():.2f}")
    print(f"总销售额: {group['销售额'].sum():.2f}")
    print(f"平均利润率: {(group['利润'].sum() / group['销售额'].sum() * 100):.2f}%")

分组后处理并生成新数据

# 处理每个分组并收集结果
results = []
for name, group in df.groupby('部门'):
    # 对每个分组进行计算
    avg_salary = group['薪资'].mean()
    max_salary = group['薪资'].max()
    min_salary = group['薪资'].min()
    person_count = len(group)
    # 构建结果
    result = {
        '部门': name,
        '平均薪资': avg_salary,
        '最高薪资': max_salary,
        '最低薪资': min_salary,
        '人数': person_count,
        '薪资差距': max_salary - min_salary
    }
    results.append(result)
# 将结果转换为DataFrame
result_df = pd.DataFrame(results)
print("\n=== 部门统计分析结果 ===")
print(result_df)

条件筛选与分组迭代

# 创建包含更多列的数据
df_staff = pd.DataFrame({
    '部门': ['技术部', '技术部', '市场部', '市场部', '财务部'],
    '员工': ['张三', '李四', '王五', '赵六', '钱七'],
    '级别': ['高级', '中级', '中级', '高级', '高级'],
    '绩效': ['A', 'B', 'A', 'C', 'B'],
    '薪资': [20000, 15000, 12000, 16000, 18000]
})
print("员工数据:")
print(df_staff)
# 按条件分组迭代
print("\n=== 按部门和级别分组 ===")
for (dept, level), group in df_staff.groupby(['部门', '级别']):
    print(f"\n部门: {dept}, 级别: {level}")
    print(f"人数: {len(group)}")
    print(group[['员工', '绩效', '薪资']])

时间序列分组迭代

# 创建时间序列数据
dates = pd.date_range('2023-01-01', periods=365, freq='D')
df_time = pd.DataFrame({
    '日期': dates,
    '销售额': np.random.randint(1000, 5000, size=365),
    '订单量': np.random.randint(50, 200, size=365)
})
# 按月分组迭代
df_time['月份'] = df_time['日期'].dt.month
df_time['年'] = df_time['日期'].dt.year
print("\n=== 按月分组统计 ===")
for (year, month), group in df_time.groupby(['年', '月份']):
    print(f"\n{year}年{month}月:")
    print(f"总销售额: {group['销售额'].sum():,}")
    print(f"平均日销售额: {group['销售额'].mean():.2f}")
    print(f"总订单量: {group['订单量'].sum()}")

实战案例:销售数据多维分析

# 创建综合销售数据
np.random.seed(42)
df_sales_complex = pd.DataFrame({
    '年份': np.repeat([2023, 2024], 12),
    '月份': list(range(1, 13)) * 2,
    '产品': np.random.choice(['A', 'B', 'C'], size=24),
    '区域': np.random.choice(['华北', '华东', '华南'], size=24),
    '销售额': np.random.randint(10000, 50000, size=24),
    '成本': np.random.randint(5000, 30000, size=24)
})
df_sales_complex['利润'] = df_sales_complex['销售额'] - df_sales_complex['成本']
print("复杂销售数据:")
print(df_sales_complex.head())
# 多维分组分析
print("\n=== 多维度分组分析 ===")
analysis_results = {}
for (year, region), group in df_sales_complex.groupby(['年份', '区域']):
    # 计算各维度指标
    total_sales = group['销售额'].sum()
    total_cost = group['成本'].sum()
    total_profit = group['利润'].sum()
    profit_rate = (total_profit / total_sales) * 100
    avg_profit = group['利润'].mean()
    # 存储结果
    key = f"{year}-{region}"
    analysis_results[key] = {
        '年份': year,
        '区域': region,
        '总销售额': total_sales,
        '总成本': total_cost,
        '总利润': total_profit,
        '利润率%': profit_rate,
        '平均利润': avg_profit,
        '记录数': len(group)
    }
# 转换为DataFrame
analysis_df = pd.DataFrame(analysis_results).T
print("\n分析结果:")
print(analysis_df)
# 按利润率排序
print("\n=== 按利润率排序 ===")
print(analysis_df.sort_values('利润率%', ascending=False))

分组迭代优化技巧

# 1. 使用agg()进行聚合
print("\n=== 使用agg()一次完成多列统计 ===")
result_agg = df.groupby('部门').agg({
    '薪资': ['mean', 'max', 'min', 'std'],
    '年龄': ['mean', 'min', 'max']
})
print(result_agg)
# 2. 使用transform()保持原始尺寸
print("\n=== 使用transform()添加分组统计列 ===")
df['部门平均薪资'] = df.groupby('部门')['薪资'].transform('mean')
df['薪资偏差'] = df['薪资'] - df['部门平均薪资']
print(df[['部门', '姓名', '薪资', '部门平均薪资', '薪资偏差']])
# 3. 创建自定义聚合函数
def custom_stats(series):
    """自定义统计函数"""
    return pd.Series({
        '均值': series.mean(),
        '中位数': series.median(),
        '标准差': series.std(),
        '变异系数': series.std() / series.mean() * 100 if series.mean() != 0 else 0
    })
print("\n=== 使用自定义函数 ===")
stats_df = df.groupby('部门')['薪资'].apply(custom_stats).unstack()
print(stats_df)
  1. 基本迭代:使用 groupby()for 循环逐组处理
  2. 多列分组:支持基于多列的组合分组
  3. 条件处理:可以在分组内进行筛选和条件判断
  4. 结果收集:处理每个分组后汇总结果
  5. 性能优化:对于大数据集,优先使用 agg()transform() 等向量化操作
  6. 灵活应用:支持自定义函数和复杂分析逻辑

这些方法可以帮助你高效地处理和分析分组数据,适用于各种实际业务场景。

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