本文目录导读:

我来详细说明如何使用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
- 高级聚合函数
- 条件过滤
- 批量处理
- 实用工具函数
- 完整业务分析流程
你可以根据实际需求选择合适的方法,需要其他特定的分组导出方案吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播