本文目录导读:

我来详细说明如何使用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分组导出的常用场景,包括:
- 基础分组和统计
- 多级分组
- 导出到CSV和Excel
- 高级聚合函数
- 条件过滤
- 批量处理
- 实用工具函数
- 完整业务分析流程
你可以根据实际需求选择合适的方法,需要其他特定的分组导出方案吗?