Python案例如何用Pandas做数据分组导出

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据分组导出

  1. 基础分组操作
  2. 按单个列分组
  3. 按多个列分组
  4. 分组后导出到不同文件
  5. 高级分组操作示例
  6. 条件分组和过滤
  7. 批量导出为Excel多工作表
  8. 实用工具函数
  9. 完整案例:销售数据统计分析

我来详细说明如何使用Pandas进行数据分组和导出操作。

基础分组操作

import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
    '部门': ['技术部', '市场部', '技术部', '市场部', '财务部', '技术部'],
    '员工': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
    '薪资': [15000, 12000, 18000, 13000, 14000, 16000],
    '绩效': ['A', 'B', 'A', 'C', 'B', 'A'],
    '入职年份': [2020, 2019, 2021, 2020, 2018, 2022]
})
print("原始数据:")
print(df)

按单个列分组

# 按部门分组
grouped = df.groupby('部门')
# 查看分组后的统计数据
print("\n各部门统计:")
print(grouped['薪资'].agg(['mean', 'sum', 'count', 'max', 'min']))
# 遍历分组
for name, group in grouped:
    print(f"\n部门: {name}")
    print(group)

按多个列分组

# 按部门和绩效分组
grouped_multi = df.groupby(['部门', '绩效'])
print("\n各部门、绩效分组统计:")
print(grouped_multi['薪资'].agg(['mean', 'count']))
# 遍历多级分组
for (dept, perf), group in grouped_multi:
    print(f"\n部门: {dept}, 绩效: {perf}")
    print(group)

分组后导出到不同文件

import os
# 创建输出目录
output_dir = '分组数据'
os.makedirs(output_dir, exist_ok=True)
# 方法1:每个分组导出为单独的CSV文件
for name, group in df.groupby('部门'):
    filename = f"{output_dir}/部门_{name}.csv"
    group.to_csv(filename, index=False, encoding='utf-8-sig')
    print(f"已导出: {filename}")
# 方法2:导出到Excel的不同工作表
with pd.ExcelWriter(f'{output_dir}/各部门数据.xlsx', engine='openpyxl') as writer:
    for name, group in df.groupby('部门'):
        group.to_excel(writer, sheet_name=f'部门_{name}', index=False)
        print(f"已写入工作表: 部门_{name}")

高级分组操作示例

# 创建更复杂的数据集
sales_data = pd.DataFrame({
    '日期': pd.date_range('2024-01-01', periods=100, freq='D'),
    '产品': np.random.choice(['A', 'B', 'C'], 100),
    '区域': np.random.choice(['华北', '华东', '华南'], 100),
    '销量': np.random.randint(10, 100, 100),
    '金额': np.random.uniform(100, 1000, 100).round(2)
})
print("\n销售数据前5行:")
print(sales_data.head())
# 复杂分组统计
result = sales_data.groupby(['产品', '区域']).agg({
    '销量': ['sum', 'mean', 'std'],
    '金额': ['sum', 'mean', 'count']
}).round(2)
print("\n产品销售统计:")
print(result)
# 导出复杂分组结果
result.to_csv(f'{output_dir}/销售分组统计.csv', encoding='utf-8-sig')
print("\n分组统计结果已导出")

条件分组和过滤

# 分组后过滤特定条件
def filter_group(group):
    """过滤出每组中金额大于平均值的记录"""
    return group[group['金额'] > group['金额'].mean()]
# 应用过滤函数
filtered_df = sales_data.groupby('产品', group_keys=False).apply(filter_group)
print("\n过滤后的数据(每个产品金额高于平均值):")
print(filtered_df)
# 另一种方式:使用transform
sales_data['金额均值'] = sales_data.groupby('产品')['金额'].transform('mean')
high_value = sales_data[sales_data['金额'] > sales_data['金额均值']]
print("\n使用transform方法过滤:")
print(high_value)

批量导出为Excel多工作表

def export_groups_to_excel(df, group_col, filename):
    """
    将分组数据导出到Excel的多个工作表
    """
    with pd.ExcelWriter(filename, engine='openpyxl') as writer:
        # 先导出汇总表
        summary = df.groupby(group_col).agg({
            '销量': 'sum',
            '金额': ['sum', 'mean', 'count']
        }).round(2)
        summary.columns = ['销量总计', '金额总计', '金额均值', '订单数']
        summary.to_excel(writer, sheet_name='汇总')
        # 导出每个分组的详细数据
        for name, group in df.groupby(group_col):
            # 清理sheet名称(不能超过31个字符,不能包含特殊字符)
            sheet_name = str(name)[:31]
            group.to_excel(writer, sheet_name=sheet_name, index=False)
    print(f"数据已导出到: {filename}")
# 调用函数
export_groups_to_excel(sales_data, '区域', f'{output_dir}/区域销售数据.xlsx')

实用工具函数

def export_grouped_data(df, group_columns, output_dir='.', format='csv'):
    """
    通用分组导出函数
    参数:
    - df: DataFrame
    - group_columns: 分组列名列表
    - output_dir: 输出目录
    - format: 输出格式 ('csv' 或 'excel')
    """
    import os
    os.makedirs(output_dir, exist_ok=True)
    # 创建分组对象
    if len(group_columns) == 1:
        grouped = df.groupby(group_columns[0])
    else:
        grouped = df.groupby(group_columns)
    # 导出每个分组
    for name, group in grouped:
        # 生成文件名
        if isinstance(name, tuple):
            filename = '_'.join(str(x) for x in name)
        else:
            filename = str(name)
        # 清理文件名
        filename = filename.replace('/', '_').replace('\\', '_')
        if format == 'csv':
            filepath = os.path.join(output_dir, f'{filename}.csv')
            group.to_csv(filepath, index=False, encoding='utf-8-sig')
        elif format == 'excel':
            filepath = os.path.join(output_dir, f'{filename}.xlsx')
            group.to_excel(filepath, index=False)
        print(f"已导出: {filepath}")
# 使用示例
export_grouped_data(sales_data, '产品', f'{output_dir}/按产品分组', format='csv')
export_grouped_data(sales_data, ['产品', '区域'], f'{output_dir}/按产品区域分组', format='excel')

完整案例:销售数据统计分析

def sales_analysis_pipeline():
    """
    销售数据分析完整流程
    """
    # 1. 生成模拟数据
    np.random.seed(42)
    dates = pd.date_range('2024-01-01', periods=365, freq='D')
    data = {
        '日期': dates,
        '产品': np.random.choice(['A', 'B', 'C', 'D'], 365, p=[0.3, 0.3, 0.2, 0.2]),
        '区域': np.random.choice(['华北', '华东', '华南', '西南'], 365),
        '销量': np.random.randint(10, 200, 365),
        '单价': np.random.choice([100, 200, 300, 400, 500], 365),
    }
    df = pd.DataFrame(data)
    df['金额'] = df['销量'] * df['单价']
    # 2. 数据清洗
    df = df.dropna()
    df['月份'] = df['日期'].dt.month
    df['季度'] = df['日期'].dt.quarter
    # 3. 按产品和区域分组统计
    summary = df.groupby(['产品', '区域']).agg({
        '销量': ['sum', 'mean', 'std'],
        '金额': ['sum', 'mean', 'count']
    }).round(2)
    # 4. 导出结果
    with pd.ExcelWriter(f'{output_dir}/销售分析报告.xlsx', engine='openpyxl') as writer:
        # 详细数据
        df.to_excel(writer, sheet_name='原始数据', index=False)
        # 分组汇总
        summary.to_excel(writer, sheet_name='分组汇总')
        # 按月份的趋势分析
        monthly = df.groupby(['月份', '产品']).agg({
            '销量': 'sum',
            '金额': 'sum'
        }).unstack()
        monthly.to_excel(writer, sheet_name='月度趋势')
        # 按区域导出详细数据
        for region, group in df.groupby('区域'):
            group.to_excel(writer, sheet_name=f'{region}区域', index=False)
    print("销售分析报告已生成!")
    return df, summary
# 运行分析
df, summary = sales_analysis_pipeline()
print("\n数据预览:")
print(df.head())
print("\n分组汇总:")
print(summary)

这些案例覆盖了Pandas分组导出的常用场景,包括:

  1. 基础分组和统计
  2. 多级分组
  3. 导出到CSV和Excel
  4. 高级聚合函数
  5. 条件过滤
  6. 批量处理
  7. 实用工具函数
  8. 完整业务分析流程

你可以根据实际需求选择合适的方法,需要其他特定的分组导出方案吗?

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