活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

从零开始学习pandas输出Excel的详细教程包含格式设置多表导出数据处理等实用技巧助你快速提升数据分析能力

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-2 14:20:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

在数据分析和处理领域,Excel一直是最受欢迎的工具之一,而Python的pandas库则是数据科学家的得力助手。将这两者结合起来,能够极大地提升我们的数据处理和分析效率。本教程将带你从零开始,全面学习如何使用pandas将数据输出到Excel文件,包括格式设置、多表导出、数据处理等实用技巧,帮助你快速提升数据分析能力。

pandas基础

在开始学习pandas输出Excel之前,我们需要先了解pandas的基础知识。

安装pandas和openpyxl

首先,确保你已经安装了pandas库。如果还没有安装,可以通过以下命令安装:
  1. pip install pandas
复制代码

为了能够将数据输出到Excel文件,我们还需要安装openpyxl或xlsxwriter库:
  1. pip install openpyxl
  2. # 或者
  3. pip install xlsxwriter
复制代码

pandas的基本数据结构

pandas有两个主要的数据结构:Series和DataFrame。

• Series:一维标记数组,能够保存任何数据类型。
• DataFrame:二维标记数据结构,类似于表格或Excel工作表。

下面是创建这两个数据结构的简单示例:
  1. import pandas as pd
  2. import numpy as np
  3. # 创建Series
  4. s = pd.Series([1, 3, 5, np.nan, 6, 8])
  5. print("Series示例:")
  6. print(s)
  7. # 创建DataFrame
  8. data = {
  9.     '姓名': ['张三', '李四', '王五', '赵六'],
  10.     '年龄': [25, 30, 35, 40],
  11.     '城市': ['北京', '上海', '广州', '深圳']
  12. }
  13. df = pd.DataFrame(data)
  14. print("\nDataFrame示例:")
  15. print(df)
复制代码

基础Excel导出

使用to_excel()方法

pandas提供了to_excel()方法,可以将DataFrame导出为Excel文件。下面是一个简单的例子:
  1. import pandas as pd
  2. # 创建DataFrame
  3. data = {
  4.     '姓名': ['张三', '李四', '王五', '赵六'],
  5.     '年龄': [25, 30, 35, 40],
  6.     '城市': ['北京', '上海', '广州', '深圳']
  7. }
  8. df = pd.DataFrame(data)
  9. # 导出到Excel
  10. df.to_excel('output.xlsx', index=False)  # index=False表示不保存索引
复制代码

运行上述代码后,会在当前目录下生成一个名为output.xlsx的Excel文件。

to_excel()方法的常用参数

to_excel()方法有许多参数可以控制输出格式,下面是一些常用参数:
  1. df.to_excel(
  2.     excel_writer,          # 文件路径或ExcelWriter对象
  3.     sheet_name='Sheet1',   # 工作表名称
  4.     na_rep='',             # 缺失值的表示方式
  5.     float_format='%.2f',   # 浮点数的格式
  6.     columns=None,          # 要导出的列
  7.     header=True,           # 是否包含列名
  8.     index=True,            # 是否包含索引
  9.     index_label=None,      # 索引列的标签
  10.     startrow=0,            # 数据的起始行
  11.     startcol=0,            # 数据的起始列
  12.     engine=None,           # 使用的引擎('openpyxl'或'xlsxwriter')
  13.     encoding=None,         # 编码方式
  14.     inf_rep='inf',         # 无穷大的表示方式
  15.     verbose=True,          # 是否显示详细信息
  16.     freeze_panes=None      # 冻结窗格的位置
  17. )
复制代码

下面是一个使用这些参数的示例:
  1. import pandas as pd
  2. import numpy as np
  3. # 创建包含各种数据类型的DataFrame
  4. data = {
  5.     '产品': ['A', 'B', 'C', 'D'],
  6.     '价格': [12.5, 23.756, 8.99, 15.0],
  7.     '销量': [100, 150, None, 200],
  8.     '库存': [50, 75, 30, np.inf]
  9. }
  10. df = pd.DataFrame(data)
  11. # 导出到Excel,使用多种参数
  12. df.to_excel(
  13.     'products.xlsx',
  14.     sheet_name='产品信息',
  15.     na_rep='N/A',           # 缺失值显示为N/A
  16.     float_format='%.2f',    # 浮点数保留两位小数
  17.     columns=['产品', '价格', '销量'],  # 只导出这三列
  18.     index=False,            # 不导出索引
  19.     startrow=2,             # 从第3行开始写入数据
  20.     startcol=1              # 从第2列开始写入数据
  21. )
复制代码

格式设置

仅仅将数据导出到Excel是不够的,我们通常还需要设置单元格的格式,使数据更加美观和易读。

使用ExcelWriter设置格式

要设置Excel单元格的格式,我们需要使用ExcelWriter对象,并结合openpyxl或xlsxwriter库的功能。
  1. import pandas as pd
  2. from openpyxl import load_workbook
  3. from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
  4. # 创建DataFrame
  5. data = {
  6.     '产品': ['A', 'B', 'C', 'D'],
  7.     '价格': [12.5, 23.756, 8.99, 15.0],
  8.     '销量': [100, 150, 80, 200]
  9. }
  10. df = pd.DataFrame(data)
  11. # 导出到Excel
  12. with pd.ExcelWriter('formatted_output.xlsx', engine='openpyxl') as writer:
  13.     df.to_excel(writer, sheet_name='产品信息', index=False)
  14.    
  15.     # 获取工作簿和工作表对象
  16.     workbook = writer.book
  17.     worksheet = writer.sheets['产品信息']
  18.    
  19.     # 设置标题行的格式
  20.     header_font = Font(name='Arial', bold=True, color='FFFFFF')
  21.     header_fill = PatternFill(start_color='4F81BD', end_color='4F81BD', fill_type='solid')
  22.     header_alignment = Alignment(horizontal='center', vertical='center')
  23.    
  24.     # 设置边框
  25.     thin_border = Border(
  26.         left=Side(style='thin'),
  27.         right=Side(style='thin'),
  28.         top=Side(style='thin'),
  29.         bottom=Side(style='thin')
  30.     )
  31.    
  32.     # 应用格式到标题行
  33.     for cell in worksheet[1]:  # 第一行是标题行
  34.         cell.font = header_font
  35.         cell.fill = header_fill
  36.         cell.alignment = header_alignment
  37.         cell.border = thin_border
  38.    
  39.     # 设置数据行的格式
  40.     data_font = Font(name='Arial', size=10)
  41.     data_alignment = Alignment(horizontal='center', vertical='center')
  42.    
  43.     # 应用格式到数据行
  44.     for row in worksheet.iter_rows(min_row=2, max_row=worksheet.max_row):
  45.         for cell in row:
  46.             cell.font = data_font
  47.             cell.alignment = data_alignment
  48.             cell.border = thin_border
  49.    
  50.     # 设置列宽
  51.     worksheet.column_dimensions['A'].width = 10
  52.     worksheet.column_dimensions['B'].width = 10
  53.     worksheet.column_dimensions['C'].width = 10
  54.    
  55.     # 设置价格列为货币格式
  56.     for row in worksheet.iter_rows(min_row=2, max_row=worksheet.max_row, min_col=2, max_col=2):
  57.         for cell in row:
  58.             cell.number_format = '"¥"#,##0.00'
复制代码
  1. import pandas as pd
  2. # 创建DataFrame
  3. data = {
  4.     '产品': ['A', 'B', 'C', 'D'],
  5.     '价格': [12.5, 23.756, 8.99, 15.0],
  6.     '销量': [100, 150, 80, 200]
  7. }
  8. df = pd.DataFrame(data)
  9. # 创建ExcelWriter对象
  10. with pd.ExcelWriter('formatted_output_xlsxwriter.xlsx', engine='xlsxwriter') as writer:
  11.     df.to_excel(writer, sheet_name='产品信息', index=False, startrow=1)
  12.    
  13.     # 获取工作簿和工作表对象
  14.     workbook = writer.book
  15.     worksheet = writer.sheets['产品信息']
  16.    
  17.     # 定义格式
  18.     header_format = workbook.add_format({
  19.         'bold': True,
  20.         'text_wrap': True,
  21.         'valign': 'top',
  22.         'fg_color': '#4F81BD',
  23.         'font_color': 'white',
  24.         'border': 1,
  25.         'align': 'center'
  26.     })
  27.    
  28.     data_format = workbook.add_format({
  29.         'border': 1,
  30.         'align': 'center'
  31.     })
  32.    
  33.     price_format = workbook.add_format({
  34.         'num_format': '¥#,##0.00',
  35.         'border': 1,
  36.         'align': 'center'
  37.     })
  38.    
  39.     # 写入标题行
  40.     for col_num, value in enumerate(df.columns.values):
  41.         worksheet.write(0, col_num, value, header_format)
  42.    
  43.     # 应用格式到数据行
  44.     for row_num in range(1, len(df) + 1):
  45.         # 产品列
  46.         worksheet.write(row_num, 0, df.iloc[row_num-1, 0], data_format)
  47.         # 价格列
  48.         worksheet.write(row_num, 1, df.iloc[row_num-1, 1], price_format)
  49.         # 销量列
  50.         worksheet.write(row_num, 2, df.iloc[row_num-1, 2], data_format)
  51.    
  52.     # 设置列宽
  53.     worksheet.set_column('A:C', 12)
复制代码

条件格式设置

条件格式可以根据单元格的值自动应用不同的格式,使数据更加直观。
  1. import pandas as pd
  2. from openpyxl import load_workbook
  3. from openpyxl.styles import PatternFill
  4. from openpyxl.formatting.rule import CellIsRule
  5. # 创建DataFrame
  6. data = {
  7.     '产品': ['A', 'B', 'C', 'D'],
  8.     '价格': [12.5, 23.756, 8.99, 15.0],
  9.     '销量': [100, 150, 80, 200]
  10. }
  11. df = pd.DataFrame(data)
  12. # 导出到Excel
  13. with pd.ExcelWriter('conditional_formatting.xlsx', engine='openpyxl') as writer:
  14.     df.to_excel(writer, sheet_name='产品信息', index=False)
  15.    
  16.     # 获取工作簿和工作表对象
  17.     workbook = writer.book
  18.     worksheet = writer.sheets['产品信息']
  19.    
  20.     # 定义条件格式
  21.     # 价格大于15的单元格填充为绿色
  22.     green_fill = PatternFill(start_color='90EE90', end_color='90EE90', fill_type='solid')
  23.     worksheet.conditional_formatting.add(
  24.         'B2:B5',
  25.         CellIsRule(operator='greaterThan', formula=['15'], fill=green_fill)
  26.     )
  27.    
  28.     # 销量大于等于150的单元格填充为蓝色
  29.     blue_fill = PatternFill(start_color='ADD8E6', end_color='ADD8E6', fill_type='solid')
  30.     worksheet.conditional_formatting.add(
  31.         'C2:C5',
  32.         CellIsRule(operator='greaterThanOrEqual', formula=['150'], fill=blue_fill)
  33.     )
复制代码
  1. import pandas as pd
  2. # 创建DataFrame
  3. data = {
  4.     '产品': ['A', 'B', 'C', 'D'],
  5.     '价格': [12.5, 23.756, 8.99, 15.0],
  6.     '销量': [100, 150, 80, 200]
  7. }
  8. df = pd.DataFrame(data)
  9. # 创建ExcelWriter对象
  10. with pd.ExcelWriter('conditional_formatting_xlsxwriter.xlsx', engine='xlsxwriter') as writer:
  11.     df.to_excel(writer, sheet_name='产品信息', index=False)
  12.    
  13.     # 获取工作簿和工作表对象
  14.     workbook = writer.book
  15.     worksheet = writer.sheets['产品信息']
  16.    
  17.     # 添加条件格式
  18.     # 价格大于15的单元格填充为绿色
  19.     worksheet.conditional_format(
  20.         'B2:B5',  # 应用范围
  21.         {
  22.             'type': 'cell',
  23.             'criteria': '>',
  24.             'value': 15,
  25.             'format': workbook.add_format({'bg_color': '#90EE90'})
  26.         }
  27.     )
  28.    
  29.     # 销量大于等于150的单元格填充为蓝色
  30.     worksheet.conditional_format(
  31.         'C2:C5',  # 应用范围
  32.         {
  33.             'type': 'cell',
  34.             'criteria': '>=',
  35.             'value': 150,
  36.             'format': workbook.add_format({'bg_color': '#ADD8E6'})
  37.         }
  38.     )
  39.    
  40.     # 添加数据条
  41.     worksheet.conditional_format(
  42.         'C2:C5',  # 应用范围
  43.         {
  44.             'type': 'data_bar',
  45.             'bar_color': '#63C384'
  46.         }
  47.     )
复制代码

多表导出

在实际应用中,我们经常需要将多个DataFrame导出到同一个Excel文件的不同工作表中。

基本多表导出
  1. import pandas as pd
  2. # 创建多个DataFrame
  3. data1 = {
  4.     '产品': ['A', 'B', 'C', 'D'],
  5.     '价格': [12.5, 23.756, 8.99, 15.0],
  6.     '销量': [100, 150, 80, 200]
  7. }
  8. df1 = pd.DataFrame(data1)
  9. data2 = {
  10.     '月份': ['1月', '2月', '3月', '4月'],
  11.     '收入': [12500, 23756, 8990, 15000],
  12.     '成本': [8000, 15000, 6000, 10000]
  13. }
  14. df2 = pd.DataFrame(data2)
  15. data3 = {
  16.     '地区': ['北京', '上海', '广州', '深圳'],
  17.     '客户数': [120, 150, 80, 200],
  18.     '平均消费': [500, 600, 450, 700]
  19. }
  20. df3 = pd.DataFrame(data3)
  21. # 导出到同一个Excel文件的不同工作表
  22. with pd.ExcelWriter('multiple_sheets.xlsx') as writer:
  23.     df1.to_excel(writer, sheet_name='产品信息', index=False)
  24.     df2.to_excel(writer, sheet_name='财务数据', index=False)
  25.     df3.to_excel(writer, sheet_name='地区统计', index=False)
复制代码

多表导出并设置格式
  1. import pandas as pd
  2. # 创建多个DataFrame
  3. data1 = {
  4.     '产品': ['A', 'B', 'C', 'D'],
  5.     '价格': [12.5, 23.756, 8.99, 15.0],
  6.     '销量': [100, 150, 80, 200]
  7. }
  8. df1 = pd.DataFrame(data1)
  9. data2 = {
  10.     '月份': ['1月', '2月', '3月', '4月'],
  11.     '收入': [12500, 23756, 8990, 15000],
  12.     '成本': [8000, 15000, 6000, 10000]
  13. }
  14. df2 = pd.DataFrame(data2)
  15. # 创建ExcelWriter对象
  16. with pd.ExcelWriter('multiple_sheets_formatted.xlsx', engine='xlsxwriter') as writer:
  17.     # 导出第一个DataFrame
  18.     df1.to_excel(writer, sheet_name='产品信息', index=False)
  19.    
  20.     # 获取工作簿和第一个工作表对象
  21.     workbook = writer.book
  22.     worksheet1 = writer.sheets['产品信息']
  23.    
  24.     # 定义格式
  25.     header_format = workbook.add_format({
  26.         'bold': True,
  27.         'text_wrap': True,
  28.         'valign': 'top',
  29.         'fg_color': '#4F81BD',
  30.         'font_color': 'white',
  31.         'border': 1,
  32.         'align': 'center'
  33.     })
  34.    
  35.     data_format = workbook.add_format({
  36.         'border': 1,
  37.         'align': 'center'
  38.     })
  39.    
  40.     price_format = workbook.add_format({
  41.         'num_format': '¥#,##0.00',
  42.         'border': 1,
  43.         'align': 'center'
  44.     })
  45.    
  46.     # 设置第一个工作表的格式
  47.     for col_num, value in enumerate(df1.columns.values):
  48.         worksheet1.write(0, col_num, value, header_format)
  49.    
  50.     for row_num in range(1, len(df1) + 1):
  51.         worksheet1.write(row_num, 0, df1.iloc[row_num-1, 0], data_format)
  52.         worksheet1.write(row_num, 1, df1.iloc[row_num-1, 1], price_format)
  53.         worksheet1.write(row_num, 2, df1.iloc[row_num-1, 2], data_format)
  54.    
  55.     worksheet1.set_column('A:C', 12)
  56.    
  57.     # 导出第二个DataFrame
  58.     df2.to_excel(writer, sheet_name='财务数据', index=False)
  59.    
  60.     # 获取第二个工作表对象
  61.     worksheet2 = writer.sheets['财务数据']
  62.    
  63.     # 设置第二个工作表的格式
  64.     for col_num, value in enumerate(df2.columns.values):
  65.         worksheet2.write(0, col_num, value, header_format)
  66.    
  67.     currency_format = workbook.add_format({
  68.         'num_format': '¥#,##0',
  69.         'border': 1,
  70.         'align': 'center'
  71.     })
  72.    
  73.     for row_num in range(1, len(df2) + 1):
  74.         worksheet2.write(row_num, 0, df2.iloc[row_num-1, 0], data_format)
  75.         worksheet2.write(row_num, 1, df2.iloc[row_num-1, 1], currency_format)
  76.         worksheet2.write(row_num, 2, df2.iloc[row_num-1, 2], currency_format)
  77.    
  78.     worksheet2.set_column('A:C', 12)
  79.    
  80.     # 添加一个汇总工作表
  81.     summary_data = {
  82.         '指标': ['总产品数', '平均价格', '总销量', '总收入', '总成本'],
  83.         '值': [
  84.             len(df1),
  85.             df1['价格'].mean(),
  86.             df1['销量'].sum(),
  87.             df2['收入'].sum(),
  88.             df2['成本'].sum()
  89.         ]
  90.     }
  91.     df_summary = pd.DataFrame(summary_data)
  92.    
  93.     df_summary.to_excel(writer, sheet_name='汇总', index=False)
  94.    
  95.     # 获取汇总工作表对象
  96.     worksheet_summary = writer.sheets['汇总']
  97.    
  98.     # 设置汇总工作表的格式
  99.     for col_num, value in enumerate(df_summary.columns.values):
  100.         worksheet_summary.write(0, col_num, value, header_format)
  101.    
  102.     value_format = workbook.add_format({
  103.         'num_format': '#,##0.00',
  104.         'border': 1,
  105.         'align': 'center'
  106.     })
  107.    
  108.     for row_num in range(1, len(df_summary) + 1):
  109.         worksheet_summary.write(row_num, 0, df_summary.iloc[row_num-1, 0], data_format)
  110.         worksheet_summary.write(row_num, 1, df_summary.iloc[row_num-1, 1], value_format)
  111.    
  112.     worksheet_summary.set_column('A:B', 15)
复制代码

数据处理技巧

在将数据导出到Excel之前,我们通常需要进行一些数据处理操作。下面是一些常见的数据处理技巧。

数据清洗
  1. import pandas as pd
  2. import numpy as np
  3. # 创建包含脏数据的DataFrame
  4. data = {
  5.     '产品': ['A', 'B', 'C', 'D', 'E', 'F'],
  6.     '价格': [12.5, 23.756, 8.99, 15.0, np.nan, 18.5],
  7.     '销量': [100, 150, 80, 200, 120, None],
  8.     '分类': ['电子产品', '家电', '电子产品', '家电', '家具', '家具']
  9. }
  10. df = pd.DataFrame(data)
  11. print("原始数据:")
  12. print(df)
  13. # 1. 处理缺失值
  14. # 删除包含缺失值的行
  15. df_dropna = df.dropna()
  16. print("\n删除缺失值后的数据:")
  17. print(df_dropna)
  18. # 填充缺失值
  19. df_fillna = df.fillna({
  20.     '价格': df['价格'].mean(),  # 用平均价格填充缺失的价格
  21.     '销量': 0                   # 用0填充缺失的销量
  22. })
  23. print("\n填充缺失值后的数据:")
  24. print(df_fillna)
  25. # 2. 处理重复值
  26. # 添加一些重复行
  27. df_with_duplicates = pd.concat([df, df.iloc[0:2]], ignore_index=True)
  28. print("\n包含重复值的数据:")
  29. print(df_with_duplicates)
  30. # 删除重复行
  31. df_drop_duplicates = df_with_duplicates.drop_duplicates()
  32. print("\n删除重复值后的数据:")
  33. print(df_drop_duplicates)
  34. # 3. 数据类型转换
  35. # 将价格转换为整数
  36. df['价格_整数'] = df['价格'].astype('Int64')  # Int64支持NaN值
  37. print("\n转换数据类型后的数据:")
  38. print(df)
  39. # 4. 字符串处理
  40. # 在产品名称前添加"产品-"前缀
  41. df['产品_新名称'] = '产品-' + df['产品']
  42. print("\n字符串处理后的数据:")
  43. print(df)
  44. # 5. 数据筛选
  45. # 筛选价格大于15的产品
  46. df_filtered = df[df['价格'] > 15]
  47. print("\n价格大于15的产品:")
  48. print(df_filtered)
  49. # 6. 数据分组
  50. # 按分类分组并计算平均价格和总销量
  51. df_grouped = df.groupby('分类').agg({
  52.     '价格': 'mean',
  53.     '销量': 'sum'
  54. })
  55. print("\n按分类分组统计:")
  56. print(df_grouped)
复制代码

数据转换和计算
  1. import pandas as pd
  2. # 创建DataFrame
  3. data = {
  4.     '产品': ['A', 'B', 'C', 'D'],
  5.     '成本': [10, 15, 8, 12],
  6.     '售价': [15, 20, 12, 18],
  7.     '销量': [100, 150, 80, 200]
  8. }
  9. df = pd.DataFrame(data)
  10. print("原始数据:")
  11. print(df)
  12. # 1. 添加计算列
  13. # 计算利润
  14. df['利润'] = df['售价'] - df['成本']
  15. # 计算利润率
  16. df['利润率'] = (df['利润'] / df['成本']) * 100
  17. # 计算总收入
  18. df['总收入'] = df['售价'] * df['销量']
  19. # 计算总利润
  20. df['总利润'] = df['利润'] * df['销量']
  21. print("\n添加计算列后的数据:")
  22. print(df)
  23. # 2. 应用函数
  24. # 定义一个函数来评估产品表现
  25. def evaluate_performance(row):
  26.     if row['利润率'] > 50:
  27.         return '优秀'
  28.     elif row['利润率'] > 30:
  29.         return '良好'
  30.     elif row['利润率'] > 10:
  31.         return '一般'
  32.     else:
  33.         return '较差'
  34. # 应用函数
  35. df['表现评估'] = df.apply(evaluate_performance, axis=1)
  36. print("\n应用函数后的数据:")
  37. print(df)
  38. # 3. 数据排序
  39. # 按总利润降序排序
  40. df_sorted = df.sort_values('总利润', ascending=False)
  41. print("\n按总利润降序排序:")
  42. print(df_sorted)
  43. # 4. 数据排名
  44. # 添加利润排名列
  45. df['利润排名'] = df['总利润'].rank(ascending=False, method='dense').astype(int)
  46. print("\n添加排名后的数据:")
  47. print(df)
  48. # 5. 数据透视表
  49. # 创建一个更大的数据集以便演示透视表
  50. data_large = {
  51.     '产品': ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D', 'A', 'B', 'C', 'D'],
  52.     '地区': ['北京', '北京', '北京', '北京', '上海', '上海', '上海', '上海', '广州', '广州', '广州', '广州'],
  53.     '季度': ['Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1'],
  54.     '销量': [100, 150, 80, 200, 120, 180, 90, 220, 80, 140, 70, 190],
  55.     '收入': [1500, 3000, 960, 3600, 1800, 3600, 1080, 3960, 1200, 2800, 840, 3420]
  56. }
  57. df_large = pd.DataFrame(data_large)
  58. # 创建透视表
  59. pivot_table = pd.pivot_table(
  60.     df_large,
  61.     values=['销量', '收入'],
  62.     index=['地区'],
  63.     columns=['产品'],
  64.     aggfunc='sum',
  65.     fill_value=0
  66. )
  67. print("\n数据透视表:")
  68. print(pivot_table)
复制代码

数据合并
  1. import pandas as pd
  2. # 创建两个DataFrame
  3. df1 = pd.DataFrame({
  4.     '产品ID': [1, 2, 3, 4],
  5.     '产品名称': ['A', 'B', 'C', 'D'],
  6.     '成本': [10, 15, 8, 12]
  7. })
  8. df2 = pd.DataFrame({
  9.     '产品ID': [1, 2, 3, 4, 5],  # 注意这里多了一个产品ID为5的行
  10.     '售价': [15, 20, 12, 18, 25],
  11.     '分类': ['电子产品', '家电', '电子产品', '家电', '家具']
  12. })
  13. print("DataFrame 1:")
  14. print(df1)
  15. print("\nDataFrame 2:")
  16. print(df2)
  17. # 1. 内连接 (inner join)
  18. # 只保留两个DataFrame中都存在的产品ID
  19. df_inner = pd.merge(df1, df2, on='产品ID', how='inner')
  20. print("\n内连接结果:")
  21. print(df_inner)
  22. # 2. 左连接 (left join)
  23. # 保留左边的DataFrame中的所有行
  24. df_left = pd.merge(df1, df2, on='产品ID', how='left')
  25. print("\n左连接结果:")
  26. print(df_left)
  27. # 3. 右连接 (right join)
  28. # 保留右边的DataFrame中的所有行
  29. df_right = pd.merge(df1, df2, on='产品ID', how='right')
  30. print("\n右连接结果:")
  31. print(df_right)
  32. # 4. 外连接 (outer join)
  33. # 保留两个DataFrame中的所有行
  34. df_outer = pd.merge(df1, df2, on='产品ID', how='outer')
  35. print("\n外连接结果:")
  36. print(df_outer)
  37. # 5. 纵向合并 (concat)
  38. # 创建两个具有相同列的DataFrame
  39. df3 = pd.DataFrame({
  40.     '产品ID': [5, 6],
  41.     '产品名称': ['E', 'F'],
  42.     '成本': [18, 20]
  43. })
  44. # 纵向合并
  45. df_concat = pd.concat([df1, df3], ignore_index=True)
  46. print("\n纵向合并结果:")
  47. print(df_concat)
复制代码

高级技巧

使用Excel公式
  1. import pandas as pd
  2. # 创建DataFrame
  3. data = {
  4.     '产品': ['A', 'B', 'C', 'D'],
  5.     '成本': [10, 15, 8, 12],
  6.     '售价': [15, 20, 12, 18],
  7.     '销量': [100, 150, 80, 200]
  8. }
  9. df = pd.DataFrame(data)
  10. # 创建ExcelWriter对象
  11. with pd.ExcelWriter('excel_formulas.xlsx', engine='xlsxwriter') as writer:
  12.     # 导出DataFrame
  13.     df.to_excel(writer, sheet_name='产品信息', index=False)
  14.    
  15.     # 获取工作簿和工作表对象
  16.     workbook = writer.book
  17.     worksheet = writer.sheets['产品信息']
  18.    
  19.     # 添加公式列
  20.     # 添加利润列(售价-成本)
  21.     worksheet.write(1, 5, '利润')  # 列标题
  22.     for row_num in range(2, len(df) + 2):
  23.         worksheet.write_formula(
  24.             row_num, 5,  # F列
  25.             f'=C{row_num}-B{row_num}',  # 售价-成本
  26.             workbook.add_format({'num_format': '#,##0.00'})
  27.         )
  28.    
  29.     # 添加利润率列(利润/成本)
  30.     worksheet.write(1, 6, '利润率')  # 列标题
  31.     for row_num in range(2, len(df) + 2):
  32.         worksheet.write_formula(
  33.             row_num, 6,  # G列
  34.             f'=F{row_num}/B{row_num}',  # 利润/成本
  35.             workbook.add_format({'num_format': '0.00%'})
  36.         )
  37.    
  38.     # 添加总收入列(售价*销量)
  39.     worksheet.write(1, 7, '总收入')  # 列标题
  40.     for row_num in range(2, len(df) + 2):
  41.         worksheet.write_formula(
  42.             row_num, 7,  # H列
  43.             f'=C{row_num}*D{row_num}',  # 售价*销量
  44.             workbook.add_format({'num_format': '¥#,##0'})
  45.         )
  46.    
  47.     # 添加总利润列(利润*销量)
  48.     worksheet.write(1, 8, '总利润')  # 列标题
  49.     for row_num in range(2, len(df) + 2):
  50.         worksheet.write_formula(
  51.             row_num, 8,  # I列
  52.             f'=F{row_num}*D{row_num}',  # 利润*销量
  53.             workbook.add_format({'num_format': '¥#,##0'})
  54.         )
  55.    
  56.     # 添加汇总行
  57.     last_row = len(df) + 2
  58.     worksheet.write(last_row, 0, '总计')
  59.    
  60.     # 使用SUM函数计算总销量
  61.     worksheet.write_formula(
  62.         last_row, 3,  # D列
  63.         f'=SUM(D2:D{last_row-1})',
  64.         workbook.add_format({'bold': True, 'num_format': '#,##0'})
  65.     )
  66.    
  67.     # 使用SUM函数计算总收入
  68.     worksheet.write_formula(
  69.         last_row, 7,  # H列
  70.         f'=SUM(H2:H{last_row-1})',
  71.         workbook.add_format({'bold': True, 'num_format': '¥#,##0'})
  72.     )
  73.    
  74.     # 使用SUM函数计算总利润
  75.     worksheet.write_formula(
  76.         last_row, 8,  # I列
  77.         f'=SUM(I2:I{last_row-1})',
  78.         workbook.add_format({'bold': True, 'num_format': '¥#,##0'})
  79.     )
  80.    
  81.     # 设置列宽
  82.     worksheet.set_column('A:A', 10)
  83.     worksheet.set_column('B:I', 12)
复制代码

添加图表
  1. import pandas as pd
  2. # 创建DataFrame
  3. data = {
  4.     '月份': ['1月', '2月', '3月', '4月', '5月', '6月'],
  5.     '销售额': [12000, 15000, 18000, 14000, 20000, 22000],
  6.     '成本': [8000, 10000, 12000, 9000, 13000, 14000],
  7.     '利润': [4000, 5000, 6000, 5000, 7000, 8000]
  8. }
  9. df = pd.DataFrame(data)
  10. # 创建ExcelWriter对象
  11. with pd.ExcelWriter('excel_charts.xlsx', engine='xlsxwriter') as writer:
  12.     # 导出DataFrame
  13.     df.to_excel(writer, sheet_name='销售数据', index=False)
  14.    
  15.     # 获取工作簿和工作表对象
  16.     workbook = writer.book
  17.     worksheet = writer.sheets['销售数据']
  18.    
  19.     # 定义图表格式
  20.     chart_format = workbook.add_format({
  21.         'bold': True,
  22.         'font_color': 'white',
  23.         'bg_color': '#4F81BD',
  24.         'border': 1,
  25.         'align': 'center'
  26.     })
  27.    
  28.     # 设置标题行格式
  29.     for col_num, value in enumerate(df.columns.values):
  30.         worksheet.write(0, col_num, value, chart_format)
  31.    
  32.     # 设置数据行格式
  33.     data_format = workbook.add_format({
  34.         'border': 1,
  35.         'align': 'center'
  36.     })
  37.    
  38.     currency_format = workbook.add_format({
  39.         'num_format': '¥#,##0',
  40.         'border': 1,
  41.         'align': 'center'
  42.     })
  43.    
  44.     for row_num in range(1, len(df) + 1):
  45.         worksheet.write(row_num, 0, df.iloc[row_num-1, 0], data_format)
  46.         worksheet.write(row_num, 1, df.iloc[row_num-1, 1], currency_format)
  47.         worksheet.write(row_num, 2, df.iloc[row_num-1, 2], currency_format)
  48.         worksheet.write(row_num, 3, df.iloc[row_num-1, 3], currency_format)
  49.    
  50.     # 设置列宽
  51.     worksheet.set_column('A:D', 12)
  52.    
  53.     # 创建柱状图
  54.     chart_column = workbook.add_chart({'type': 'column'})
  55.    
  56.     # 配置柱状图数据系列
  57.     chart_column.add_series({
  58.         'name': '销售数据!$B$1',
  59.         'categories': '销售数据!$A$2:$A$7',
  60.         'values': '销售数据!$B$2:$B$7',
  61.         'fill': {'color': '#4F81BD'},
  62.     })
  63.    
  64.     chart_column.add_series({
  65.         'name': '销售数据!$C$1',
  66.         'categories': '销售数据!$A$2:$A$7',
  67.         'values': '销售数据!$C$2:$C$7',
  68.         'fill': {'color': '#9BBB59'},
  69.     })
  70.    
  71.     chart_column.add_series({
  72.         'name': '销售数据!$D$1',
  73.         'categories': '销售数据!$A$2:$A$7',
  74.         'values': '销售数据!$D$2:$D$7',
  75.         'fill': {'color': '#C0504D'},
  76.     })
  77.    
  78.     # 设置图表标题和样式
  79.     chart_column.set_title({'name': '月度销售数据'})
  80.     chart_column.set_x_axis({'name': '月份'})
  81.     chart_column.set_y_axis({'name': '金额 (¥)'})
  82.     chart_column.set_legend({'position': 'top'})
  83.    
  84.     # 插入柱状图
  85.     worksheet.insert_chart('F2', chart_column, {'x_offset': 25, 'y_offset': 10})
  86.    
  87.     # 创建折线图
  88.     chart_line = workbook.add_chart({'type': 'line'})
  89.    
  90.     # 配置折线图数据系列
  91.     chart_line.add_series({
  92.         'name': '销售数据!$B$1',
  93.         'categories': '销售数据!$A$2:$A$7',
  94.         'values': '销售数据!$B$2:$B$7',
  95.         'line': {'color': '#4F81BD', 'width': 3},
  96.         'marker': {'type': 'circle', 'size': 6, 'border': {'color': '#4F81BD'}, 'fill': {'color': '#4F81BD'}}
  97.     })
  98.    
  99.     chart_line.add_series({
  100.         'name': '销售数据!$C$1',
  101.         'categories': '销售数据!$A$2:$A$7',
  102.         'values': '销售数据!$C$2:$C$7',
  103.         'line': {'color': '#9BBB59', 'width': 3},
  104.         'marker': {'type': 'square', 'size': 6, 'border': {'color': '#9BBB59'}, 'fill': {'color': '#9BBB59'}}
  105.     })
  106.    
  107.     chart_line.add_series({
  108.         'name': '销售数据!$D$1',
  109.         'categories': '销售数据!$A$2:$A$7',
  110.         'values': '销售数据!$D$2:$D$7',
  111.         'line': {'color': '#C0504D', 'width': 3},
  112.         'marker': {'type': 'triangle', 'size': 6, 'border': {'color': '#C0504D'}, 'fill': {'color': '#C0504D'}}
  113.     })
  114.    
  115.     # 设置图表标题和样式
  116.     chart_line.set_title({'name': '月度销售趋势'})
  117.     chart_line.set_x_axis({'name': '月份'})
  118.     chart_line.set_y_axis({'name': '金额 (¥)'})
  119.     chart_line.set_legend({'position': 'top'})
  120.    
  121.     # 插入折线图
  122.     worksheet.insert_chart('F20', chart_line, {'x_offset': 25, 'y_offset': 10})
  123.    
  124.     # 创建饼图
  125.     chart_pie = workbook.add_chart({'type': 'pie'})
  126.    
  127.     # 配置饼图数据系列
  128.     chart_pie.add_series({
  129.         'name': '销售数据!$B$1',
  130.         'categories': '销售数据!$A$2:$A$7',
  131.         'values': '销售数据!$B$2:$B$7',
  132.         'data_labels': {'value': True, 'percentage': True},
  133.     })
  134.    
  135.     # 设置图表标题和样式
  136.     chart_pie.set_title({'name': '销售额分布'})
  137.     chart_pie.set_legend({'position': 'right'})
  138.    
  139.     # 插入饼图
  140.     worksheet.insert_chart('F38', chart_pie, {'x_offset': 25, 'y_offset': 10})
复制代码

数据验证
  1. import pandas as pd
  2. # 创建DataFrame
  3. data = {
  4.     '产品': ['A', 'B', 'C', 'D'],
  5.     '价格': [12.5, 23.756, 8.99, 15.0],
  6.     '库存': [100, 150, 80, 200]
  7. }
  8. df = pd.DataFrame(data)
  9. # 创建ExcelWriter对象
  10. with pd.ExcelWriter('data_validation.xlsx', engine='xlsxwriter') as writer:
  11.     # 导出DataFrame
  12.     df.to_excel(writer, sheet_name='产品信息', index=False)
  13.    
  14.     # 获取工作簿和工作表对象
  15.     workbook = writer.book
  16.     worksheet = writer.sheets['产品信息']
  17.    
  18.     # 设置标题行格式
  19.     header_format = workbook.add_format({
  20.         'bold': True,
  21.         'text_wrap': True,
  22.         'valign': 'top',
  23.         'fg_color': '#4F81BD',
  24.         'font_color': 'white',
  25.         'border': 1,
  26.         'align': 'center'
  27.     })
  28.    
  29.     # 设置数据行格式
  30.     data_format = workbook.add_format({
  31.         'border': 1,
  32.         'align': 'center'
  33.     })
  34.    
  35.     # 应用格式
  36.     for col_num, value in enumerate(df.columns.values):
  37.         worksheet.write(0, col_num, value, header_format)
  38.    
  39.     for row_num in range(1, len(df) + 1):
  40.         for col_num in range(len(df.columns)):
  41.             worksheet.write(row_num, col_num, df.iloc[row_num-1, col_num], data_format)
  42.    
  43.     # 设置列宽
  44.     worksheet.set_column('A:C', 12)
  45.    
  46.     # 添加数据验证
  47.     # 1. 产品列:下拉列表
  48.     worksheet.data_validation(
  49.         'A2:A100',  # 应用范围
  50.         {
  51.             'validate': 'list',
  52.             'source': ['A', 'B', 'C', 'D', 'E', 'F'],
  53.             'input_title': '选择产品',
  54.             'input_message': '请从下拉列表中选择产品',
  55.         }
  56.     )
  57.    
  58.     # 2. 价格列:数值范围
  59.     worksheet.data_validation(
  60.         'B2:B100',  # 应用范围
  61.         {
  62.             'validate': 'decimal',
  63.             'criteria': 'between',
  64.             'minimum': 0,
  65.             'maximum': 100,
  66.             'input_title': '输入价格',
  67.             'input_message': '请输入0到100之间的价格',
  68.             'error_title': '输入错误',
  69.             'error_message': '价格必须在0到100之间'
  70.         }
  71.     )
  72.    
  73.     # 3. 库存列:整数范围
  74.     worksheet.data_validation(
  75.         'C2:C100',  # 应用范围
  76.         {
  77.             'validate': 'integer',
  78.             'criteria': 'between',
  79.             'minimum': 0,
  80.             'maximum': 1000,
  81.             'input_title': '输入库存',
  82.             'input_message': '请输入0到1000之间的整数库存',
  83.             'error_title': '输入错误',
  84.             'error_message': '库存必须是0到1000之间的整数'
  85.         }
  86.     )
  87.    
  88.     # 添加一个新工作表,用于数据输入
  89.     worksheet_input = workbook.add_worksheet('数据输入')
  90.    
  91.     # 设置表头
  92.     headers = ['产品', '价格', '库存']
  93.     for col_num, header in enumerate(headers):
  94.         worksheet_input.write(0, col_num, header, header_format)
  95.    
  96.     # 设置列宽
  97.     worksheet_input.set_column('A:C', 12)
  98.    
  99.     # 应用数据验证
  100.     # 产品列:下拉列表
  101.     worksheet_input.data_validation(
  102.         'A2:A100',  # 应用范围
  103.         {
  104.             'validate': 'list',
  105.             'source': ['A', 'B', 'C', 'D', 'E', 'F'],
  106.             'input_title': '选择产品',
  107.             'input_message': '请从下拉列表中选择产品',
  108.         }
  109.     )
  110.    
  111.     # 价格列:数值范围
  112.     worksheet_input.data_validation(
  113.         'B2:B100',  # 应用范围
  114.         {
  115.             'validate': 'decimal',
  116.             'criteria': 'between',
  117.             'minimum': 0,
  118.             'maximum': 100,
  119.             'input_title': '输入价格',
  120.             'input_message': '请输入0到100之间的价格',
  121.             'error_title': '输入错误',
  122.             'error_message': '价格必须在0到100之间'
  123.         }
  124.     )
  125.    
  126.     # 库存列:整数范围
  127.     worksheet_input.data_validation(
  128.         'C2:C100',  # 应用范围
  129.         {
  130.             'validate': 'integer',
  131.             'criteria': 'between',
  132.             'minimum': 0,
  133.             'maximum': 1000,
  134.             'input_title': '输入库存',
  135.             'input_message': '请输入0到1000之间的整数库存',
  136.             'error_title': '输入错误',
  137.             'error_message': '库存必须是0到1000之间的整数'
  138.         }
  139.     )
  140.    
  141.     # 添加一些示例数据
  142.     worksheet_input.write(1, 0, 'A', data_format)
  143.     worksheet_input.write(1, 1, 15.5, data_format)
  144.     worksheet_input.write(1, 2, 100, data_format)
  145.    
  146.     worksheet_input.write(2, 0, 'B', data_format)
  147.     worksheet_input.write(2, 1, 25.0, data_format)
  148.     worksheet_input.write(2, 2, 150, data_format)
复制代码

实际案例

下面是一个完整的实际案例,展示如何从数据收集、处理、分析到最终导出为格式化的Excel报告的整个过程。
  1. import pandas as pd
  2. import numpy as np
  3. from datetime import datetime, timedelta
  4. # 1. 数据生成和收集
  5. # 模拟生成销售数据
  6. def generate_sales_data(start_date, end_date):
  7.     date_range = pd.date_range(start=start_date, end=end_date)
  8.     products = ['A', 'B', 'C', 'D', 'E']
  9.     regions = ['北京', '上海', '广州', '深圳', '成都']
  10.    
  11.     data = []
  12.     for date in date_range:
  13.         for product in products:
  14.             for region in regions:
  15.                 # 生成随机数据
  16.                 base_price = np.random.uniform(10, 50)
  17.                 quantity = np.random.randint(10, 100)
  18.                 discount = np.random.choice([0, 0.05, 0.1, 0.15, 0.2], p=[0.5, 0.2, 0.15, 0.1, 0.05])
  19.                
  20.                 # 计算销售额和利润
  21.                 cost = base_price * 0.6  # 成本是售价的60%
  22.                 price = base_price * (1 - discount)
  23.                 sales = price * quantity
  24.                 profit = (price - cost) * quantity
  25.                
  26.                 data.append({
  27.                     '日期': date,
  28.                     '产品': product,
  29.                     '地区': region,
  30.                     '成本': cost,
  31.                     '售价': price,
  32.                     '折扣': discount,
  33.                     '销量': quantity,
  34.                     '销售额': sales,
  35.                     '利润': profit
  36.                 })
  37.    
  38.     return pd.DataFrame(data)
  39. # 生成过去一年的销售数据
  40. end_date = datetime.now().date()
  41. start_date = end_date - timedelta(days=365)
  42. sales_data = generate_sales_data(start_date, end_date)
  43. print("生成的销售数据示例:")
  44. print(sales_data.head())
  45. # 2. 数据清洗和预处理
  46. # 检查缺失值
  47. print("\n缺失值检查:")
  48. print(sales_data.isnull().sum())
  49. # 检查数据类型
  50. print("\n数据类型:")
  51. print(sales_data.dtypes)
  52. # 转换日期列为datetime类型
  53. sales_data['日期'] = pd.to_datetime(sales_data['日期'])
  54. # 添加月份和季度列
  55. sales_data['月份'] = sales_data['日期'].dt.to_period('M')
  56. sales_data['季度'] = sales_data['日期'].dt.to_period('Q')
  57. print("\n添加月份和季度后的数据示例:")
  58. print(sales_data.head())
  59. # 3. 数据分析
  60. # 按产品分析
  61. product_analysis = sales_data.groupby('产品').agg({
  62.     '销量': 'sum',
  63.     '销售额': 'sum',
  64.     '利润': 'sum',
  65.     '折扣': 'mean'
  66. }).reset_index()
  67. # 添加利润率列
  68. product_analysis['利润率'] = (product_analysis['利润'] / product_analysis['销售额']) * 100
  69. print("\n产品分析:")
  70. print(product_analysis)
  71. # 按地区分析
  72. region_analysis = sales_data.groupby('地区').agg({
  73.     '销量': 'sum',
  74.     '销售额': 'sum',
  75.     '利润': 'sum'
  76. }).reset_index()
  77. # 添加利润率列
  78. region_analysis['利润率'] = (region_analysis['利润'] / region_analysis['销售额']) * 100
  79. print("\n地区分析:")
  80. print(region_analysis)
  81. # 按月份分析
  82. monthly_analysis = sales_data.groupby('月份').agg({
  83.     '销量': 'sum',
  84.     '销售额': 'sum',
  85.     '利润': 'sum'
  86. }).reset_index()
  87. # 将月份转换为字符串格式
  88. monthly_analysis['月份'] = monthly_analysis['月份'].astype(str)
  89. # 添加利润率列
  90. monthly_analysis['利润率'] = (monthly_analysis['利润'] / monthly_analysis['销售额']) * 100
  91. print("\n月度分析:")
  92. print(monthly_analysis.head())
  93. # 按季度分析
  94. quarterly_analysis = sales_data.groupby('季度').agg({
  95.     '销量': 'sum',
  96.     '销售额': 'sum',
  97.     '利润': 'sum'
  98. }).reset_index()
  99. # 将季度转换为字符串格式
  100. quarterly_analysis['季度'] = quarterly_analysis['季度'].astype(str)
  101. # 添加利润率列
  102. quarterly_analysis['利润率'] = (quarterly_analysis['利润'] / quarterly_analysis['销售额']) * 100
  103. print("\n季度分析:")
  104. print(quarterly_analysis)
  105. # 4. 导出Excel报告
  106. # 创建ExcelWriter对象
  107. with pd.ExcelWriter('sales_report.xlsx', engine='xlsxwriter') as writer:
  108.     # 定义格式
  109.     header_format = writer.book.add_format({
  110.         'bold': True,
  111.         'text_wrap': True,
  112.         'valign': 'top',
  113.         'fg_color': '#4F81BD',
  114.         'font_color': 'white',
  115.         'border': 1,
  116.         'align': 'center'
  117.     })
  118.    
  119.     data_format = writer.book.add_format({
  120.         'border': 1,
  121.         'align': 'center'
  122.     })
  123.    
  124.     currency_format = writer.book.add_format({
  125.         'num_format': '¥#,##0',
  126.         'border': 1,
  127.         'align': 'center'
  128.     })
  129.    
  130.     percentage_format = writer.book.add_format({
  131.         'num_format': '0.00%',
  132.         'border': 1,
  133.         'align': 'center'
  134.     })
  135.    
  136.     # 导出原始数据
  137.     sales_data.to_excel(writer, sheet_name='原始数据', index=False)
  138.     worksheet_raw = writer.sheets['原始数据']
  139.    
  140.     # 设置原始数据格式
  141.     for col_num, value in enumerate(sales_data.columns.values):
  142.         worksheet_raw.write(0, col_num, value, header_format)
  143.    
  144.     for row_num in range(1, len(sales_data) + 1):
  145.         for col_num, col_name in enumerate(sales_data.columns):
  146.             if col_name in ['成本', '售价', '销售额', '利润']:
  147.                 worksheet_raw.write(row_num, col_num, sales_data.iloc[row_num-1, col_num], currency_format)
  148.             elif col_name == '折扣':
  149.                 worksheet_raw.write(row_num, col_num, sales_data.iloc[row_num-1, col_num], percentage_format)
  150.             else:
  151.                 worksheet_raw.write(row_num, col_num, sales_data.iloc[row_num-1, col_num], data_format)
  152.    
  153.     # 设置列宽
  154.     worksheet_raw.set_column('A:A', 12)  # 日期
  155.     worksheet_raw.set_column('B:B', 8)   # 产品
  156.     worksheet_raw.set_column('C:C', 8)   # 地区
  157.     worksheet_raw.set_column('D:G', 10)  # 成本、售价、折扣、销量
  158.     worksheet_raw.set_column('H:I', 12)  # 销售额、利润
  159.    
  160.     # 导出产品分析
  161.     product_analysis.to_excel(writer, sheet_name='产品分析', index=False)
  162.     worksheet_product = writer.sheets['产品分析']
  163.    
  164.     # 设置产品分析格式
  165.     for col_num, value in enumerate(product_analysis.columns.values):
  166.         worksheet_product.write(0, col_num, value, header_format)
  167.    
  168.     for row_num in range(1, len(product_analysis) + 1):
  169.         worksheet_product.write(row_num, 0, product_analysis.iloc[row_num-1, 0], data_format)  # 产品
  170.         worksheet_product.write(row_num, 1, product_analysis.iloc[row_num-1, 1], data_format)  # 销量
  171.         worksheet_product.write(row_num, 2, product_analysis.iloc[row_num-1, 2], currency_format)  # 销售额
  172.         worksheet_product.write(row_num, 3, product_analysis.iloc[row_num-1, 3], currency_format)  # 利润
  173.         worksheet_product.write(row_num, 4, product_analysis.iloc[row_num-1, 4], percentage_format)  # 利润率
  174.    
  175.     # 设置列宽
  176.     worksheet_product.set_column('A:A', 8)   # 产品
  177.     worksheet_product.set_column('B:B', 10)  # 销量
  178.     worksheet_product.set_column('C:E', 12) # 销售额、利润、利润率
  179.    
  180.     # 添加产品分析图表
  181.     chart_product = writer.book.add_chart({'type': 'column'})
  182.    
  183.     # 配置图表数据系列
  184.     chart_product.add_series({
  185.         'name': '产品分析!$C$1',
  186.         'categories': '产品分析!$A$2:$A$6',
  187.         'values': '产品分析!$C$2:$C$6',
  188.         'fill': {'color': '#4F81BD'},
  189.     })
  190.    
  191.     chart_product.add_series({
  192.         'name': '产品分析!$D$1',
  193.         'categories': '产品分析!$A$2:$A$6',
  194.         'values': '产品分析!$D$2:$D$6',
  195.         'fill': {'color': '#9BBB59'},
  196.     })
  197.    
  198.     # 设置图表标题和样式
  199.     chart_product.set_title({'name': '产品销售额与利润'})
  200.     chart_product.set_x_axis({'name': '产品'})
  201.     chart_product.set_y_axis({'name': '金额 (¥)'})
  202.     chart_product.set_legend({'position': 'top'})
  203.    
  204.     # 插入图表
  205.     worksheet_product.insert_chart('G2', chart_product, {'x_offset': 25, 'y_offset': 10})
  206.    
  207.     # 导出地区分析
  208.     region_analysis.to_excel(writer, sheet_name='地区分析', index=False)
  209.     worksheet_region = writer.sheets['地区分析']
  210.    
  211.     # 设置地区分析格式
  212.     for col_num, value in enumerate(region_analysis.columns.values):
  213.         worksheet_region.write(0, col_num, value, header_format)
  214.    
  215.     for row_num in range(1, len(region_analysis) + 1):
  216.         worksheet_region.write(row_num, 0, region_analysis.iloc[row_num-1, 0], data_format)  # 地区
  217.         worksheet_region.write(row_num, 1, region_analysis.iloc[row_num-1, 1], data_format)  # 销量
  218.         worksheet_region.write(row_num, 2, region_analysis.iloc[row_num-1, 2], currency_format)  # 销售额
  219.         worksheet_region.write(row_num, 3, region_analysis.iloc[row_num-1, 3], currency_format)  # 利润
  220.         worksheet_region.write(row_num, 4, region_analysis.iloc[row_num-1, 4], percentage_format)  # 利润率
  221.    
  222.     # 设置列宽
  223.     worksheet_region.set_column('A:A', 8)   # 地区
  224.     worksheet_region.set_column('B:B', 10)  # 销量
  225.     worksheet_region.set_column('C:E', 12) # 销售额、利润、利润率
  226.    
  227.     # 添加地区分析图表
  228.     chart_region = writer.book.add_chart({'type': 'pie'})
  229.    
  230.     # 配置图表数据系列
  231.     chart_region.add_series({
  232.         'name': '地区分析!$C$1',
  233.         'categories': '地区分析!$A$2:$A$6',
  234.         'values': '地区分析!$C$2:$C$6',
  235.         'data_labels': {'value': True, 'percentage': True},
  236.     })
  237.    
  238.     # 设置图表标题和样式
  239.     chart_region.set_title({'name': '地区销售额分布'})
  240.     chart_region.set_legend({'position': 'right'})
  241.    
  242.     # 插入图表
  243.     worksheet_region.insert_chart('G2', chart_region, {'x_offset': 25, 'y_offset': 10})
  244.    
  245.     # 导出月度分析
  246.     monthly_analysis.to_excel(writer, sheet_name='月度分析', index=False)
  247.     worksheet_monthly = writer.sheets['月度分析']
  248.    
  249.     # 设置月度分析格式
  250.     for col_num, value in enumerate(monthly_analysis.columns.values):
  251.         worksheet_monthly.write(0, col_num, value, header_format)
  252.    
  253.     for row_num in range(1, len(monthly_analysis) + 1):
  254.         worksheet_monthly.write(row_num, 0, monthly_analysis.iloc[row_num-1, 0], data_format)  # 月份
  255.         worksheet_monthly.write(row_num, 1, monthly_analysis.iloc[row_num-1, 1], data_format)  # 销量
  256.         worksheet_monthly.write(row_num, 2, monthly_analysis.iloc[row_num-1, 2], currency_format)  # 销售额
  257.         worksheet_monthly.write(row_num, 3, monthly_analysis.iloc[row_num-1, 3], currency_format)  # 利润
  258.         worksheet_monthly.write(row_num, 4, monthly_analysis.iloc[row_num-1, 4], percentage_format)  # 利润率
  259.    
  260.     # 设置列宽
  261.     worksheet_monthly.set_column('A:A', 10)  # 月份
  262.     worksheet_monthly.set_column('B:B', 10)  # 销量
  263.     worksheet_monthly.set_column('C:E', 12) # 销售额、利润、利润率
  264.    
  265.     # 添加月度分析图表
  266.     chart_monthly = writer.book.add_chart({'type': 'line'})
  267.    
  268.     # 配置图表数据系列
  269.     chart_monthly.add_series({
  270.         'name': '月度分析!$C$1',
  271.         'categories': '月度分析!$A$2:$A$13',
  272.         'values': '月度分析!$C$2:$C$13',
  273.         'line': {'color': '#4F81BD', 'width': 3},
  274.         'marker': {'type': 'circle', 'size': 6, 'border': {'color': '#4F81BD'}, 'fill': {'color': '#4F81BD'}}
  275.     })
  276.    
  277.     chart_monthly.add_series({
  278.         'name': '月度分析!$D$1',
  279.         'categories': '月度分析!$A$2:$A$13',
  280.         'values': '月度分析!$D$2:$D$13',
  281.         'line': {'color': '#9BBB59', 'width': 3},
  282.         'marker': {'type': 'square', 'size': 6, 'border': {'color': '#9BBB59'}, 'fill': {'color': '#9BBB59'}}
  283.     })
  284.    
  285.     # 设置图表标题和样式
  286.     chart_monthly.set_title({'name': '月度销售趋势'})
  287.     chart_monthly.set_x_axis({'name': '月份'})
  288.     chart_monthly.set_y_axis({'name': '金额 (¥)'})
  289.     chart_monthly.set_legend({'position': 'top'})
  290.    
  291.     # 插入图表
  292.     worksheet_monthly.insert_chart('G2', chart_monthly, {'x_offset': 25, 'y_offset': 10})
  293.    
  294.     # 导出季度分析
  295.     quarterly_analysis.to_excel(writer, sheet_name='季度分析', index=False)
  296.     worksheet_quarterly = writer.sheets['季度分析']
  297.    
  298.     # 设置季度分析格式
  299.     for col_num, value in enumerate(quarterly_analysis.columns.values):
  300.         worksheet_quarterly.write(0, col_num, value, header_format)
  301.    
  302.     for row_num in range(1, len(quarterly_analysis) + 1):
  303.         worksheet_quarterly.write(row_num, 0, quarterly_analysis.iloc[row_num-1, 0], data_format)  # 季度
  304.         worksheet_quarterly.write(row_num, 1, quarterly_analysis.iloc[row_num-1, 1], data_format)  # 销量
  305.         worksheet_quarterly.write(row_num, 2, quarterly_analysis.iloc[row_num-1, 2], currency_format)  # 销售额
  306.         worksheet_quarterly.write(row_num, 3, quarterly_analysis.iloc[row_num-1, 3], currency_format)  # 利润
  307.         worksheet_quarterly.write(row_num, 4, quarterly_analysis.iloc[row_num-1, 4], percentage_format)  # 利润率
  308.    
  309.     # 设置列宽
  310.     worksheet_quarterly.set_column('A:A', 10)  # 季度
  311.     worksheet_quarterly.set_column('B:B', 10)  # 销量
  312.     worksheet_quarterly.set_column('C:E', 12) # 销售额、利润、利润率
  313.    
  314.     # 添加季度分析图表
  315.     chart_quarterly = writer.book.add_chart({'type': 'column'})
  316.    
  317.     # 配置图表数据系列
  318.     chart_quarterly.add_series({
  319.         'name': '季度分析!$C$1',
  320.         'categories': '季度分析!$A$2:$A$5',
  321.         'values': '季度分析!$C$2:$C$5',
  322.         'fill': {'color': '#4F81BD'},
  323.     })
  324.    
  325.     chart_quarterly.add_series({
  326.         'name': '季度分析!$D$1',
  327.         'categories': '季度分析!$A$2:$A$5',
  328.         'values': '季度分析!$D$2:$D$5',
  329.         'fill': {'color': '#9BBB59'},
  330.     })
  331.    
  332.     # 设置图表标题和样式
  333.     chart_quarterly.set_title({'name': '季度销售对比'})
  334.     chart_quarterly.set_x_axis({'name': '季度'})
  335.     chart_quarterly.set_y_axis({'name': '金额 (¥)'})
  336.     chart_quarterly.set_legend({'position': 'top'})
  337.    
  338.     # 插入图表
  339.     worksheet_quarterly.insert_chart('G2', chart_quarterly, {'x_offset': 25, 'y_offset': 10})
  340.    
  341.     # 添加汇总工作表
  342.     summary_data = {
  343.         '指标': [
  344.             '总销售额',
  345.             '总利润',
  346.             '平均利润率',
  347.             '总销量',
  348.             '最畅销产品',
  349.             '最佳销售地区',
  350.             '最佳销售月份',
  351.             '最佳销售季度'
  352.         ],
  353.         '值': [
  354.             sales_data['销售额'].sum(),
  355.             sales_data['利润'].sum(),
  356.             (sales_data['利润'].sum() / sales_data['销售额'].sum()),
  357.             sales_data['销量'].sum(),
  358.             product_analysis.loc[product_analysis['销售额'].idxmax(), '产品'],
  359.             region_analysis.loc[region_analysis['销售额'].idxmax(), '地区'],
  360.             monthly_analysis.loc[monthly_analysis['销售额'].idxmax(), '月份'],
  361.             quarterly_analysis.loc[quarterly_analysis['销售额'].idxmax(), '季度']
  362.         ]
  363.     }
  364.     df_summary = pd.DataFrame(summary_data)
  365.    
  366.     df_summary.to_excel(writer, sheet_name='汇总', index=False)
  367.     worksheet_summary = writer.sheets['汇总']
  368.    
  369.     # 设置汇总格式
  370.     for col_num, value in enumerate(df_summary.columns.values):
  371.         worksheet_summary.write(0, col_num, value, header_format)
  372.    
  373.     for row_num in range(1, len(df_summary) + 1):
  374.         worksheet_summary.write(row_num, 0, df_summary.iloc[row_num-1, 0], data_format)  # 指标
  375.         
  376.         # 根据指标类型设置不同的格式
  377.         if row_num in [1, 2, 4]:  # 数值指标
  378.             worksheet_summary.write(row_num, 1, df_summary.iloc[row_num-1, 1], currency_format)
  379.         elif row_num == 3:  # 百分比指标
  380.             worksheet_summary.write(row_num, 1, df_summary.iloc[row_num-1, 1], percentage_format)
  381.         else:  # 文本指标
  382.             worksheet_summary.write(row_num, 1, df_summary.iloc[row_num-1, 1], data_format)
  383.    
  384.     # 设置列宽
  385.     worksheet_summary.set_column('A:A', 15)  # 指标
  386.     worksheet_summary.set_column('B:B', 15)  # 值
  387. print("\nExcel报告已生成: sales_report.xlsx")
复制代码

总结与建议

通过本教程,我们全面学习了如何使用pandas将数据输出到Excel文件,包括基础导出、格式设置、多表导出、数据处理以及高级技巧。下面是一些总结和建议:

关键要点总结

1. 基础导出:使用to_excel()方法可以轻松将DataFrame导出为Excel文件,通过参数可以控制导出的各个方面。
2. 格式设置:通过ExcelWriter对象结合openpyxl或xlsxwriter库,可以设置单元格的格式,包括字体、颜色、边框、对齐方式等。
3. 多表导出:使用同一个ExcelWriter对象,可以将多个DataFrame导出到同一个Excel文件的不同工作表中。
4. 数据处理:在导出Excel之前,通常需要进行数据清洗、转换、计算等操作,pandas提供了丰富的功能来处理这些任务。
5. 高级技巧:包括添加Excel公式、图表、数据验证等,可以使Excel报告更加专业和交互式。

基础导出:使用to_excel()方法可以轻松将DataFrame导出为Excel文件,通过参数可以控制导出的各个方面。

格式设置:通过ExcelWriter对象结合openpyxl或xlsxwriter库,可以设置单元格的格式,包括字体、颜色、边框、对齐方式等。

多表导出:使用同一个ExcelWriter对象,可以将多个DataFrame导出到同一个Excel文件的不同工作表中。

数据处理:在导出Excel之前,通常需要进行数据清洗、转换、计算等操作,pandas提供了丰富的功能来处理这些任务。

高级技巧:包括添加Excel公式、图表、数据验证等,可以使Excel报告更加专业和交互式。

最佳实践建议

1. 选择合适的引擎:openpyxl:适合处理现有的Excel文件,支持更多的Excel功能。xlsxwriter:适合创建新的Excel文件,性能更好,支持更多的格式选项。
2. openpyxl:适合处理现有的Excel文件,支持更多的Excel功能。
3. xlsxwriter:适合创建新的Excel文件,性能更好,支持更多的格式选项。
4. 优化大数据导出:对于大数据集,考虑分块导出或使用chunksize参数。如果不需要格式,可以考虑导出为CSV格式,然后再用Excel打开。
5. 对于大数据集,考虑分块导出或使用chunksize参数。
6. 如果不需要格式,可以考虑导出为CSV格式,然后再用Excel打开。
7. 代码组织:将格式定义和导出逻辑分离,使代码更易于维护。使用函数封装常用的导出操作,提高代码复用性。
8. 将格式定义和导出逻辑分离,使代码更易于维护。
9. 使用函数封装常用的导出操作,提高代码复用性。
10. 错误处理:添加适当的错误处理,以应对文件权限、路径不存在等问题。在导出前检查数据的有效性,避免导出错误的数据。
11. 添加适当的错误处理,以应对文件权限、路径不存在等问题。
12. 在导出前检查数据的有效性,避免导出错误的数据。
13. 性能考虑:避免在循环中频繁调用Excel操作,尽量批量处理。对于复杂的格式设置,考虑先创建模板文件,然后填充数据。
14. 避免在循环中频繁调用Excel操作,尽量批量处理。
15. 对于复杂的格式设置,考虑先创建模板文件,然后填充数据。

选择合适的引擎:

• openpyxl:适合处理现有的Excel文件,支持更多的Excel功能。
• xlsxwriter:适合创建新的Excel文件,性能更好,支持更多的格式选项。

优化大数据导出:

• 对于大数据集,考虑分块导出或使用chunksize参数。
• 如果不需要格式,可以考虑导出为CSV格式,然后再用Excel打开。

代码组织:

• 将格式定义和导出逻辑分离,使代码更易于维护。
• 使用函数封装常用的导出操作,提高代码复用性。

错误处理:

• 添加适当的错误处理,以应对文件权限、路径不存在等问题。
• 在导出前检查数据的有效性,避免导出错误的数据。

性能考虑:

• 避免在循环中频繁调用Excel操作,尽量批量处理。
• 对于复杂的格式设置,考虑先创建模板文件,然后填充数据。

进阶学习建议

1. 深入学习pandas:掌握更多高级数据处理技巧,如数据透视表、时间序列分析等。学习如何优化pandas操作,提高数据处理效率。
2. 掌握更多高级数据处理技巧,如数据透视表、时间序列分析等。
3. 学习如何优化pandas操作,提高数据处理效率。
4. 探索其他Excel库:学习xlwings,它提供了与Excel的更深层次集成。了解pyxlsb,用于处理二进制Excel文件。
5. 学习xlwings,它提供了与Excel的更深层次集成。
6. 了解pyxlsb,用于处理二进制Excel文件。
7. 自动化报告生成:结合Python的调度工具(如schedule或APScheduler)自动生成定期报告。学习如何通过邮件或其他方式自动分发生成的Excel报告。
8. 结合Python的调度工具(如schedule或APScheduler)自动生成定期报告。
9. 学习如何通过邮件或其他方式自动分发生成的Excel报告。
10. 数据可视化:学习如何使用matplotlib和seaborn创建更复杂的图表。探索如何将交互式图表(如plotly)嵌入到Excel中。
11. 学习如何使用matplotlib和seaborn创建更复杂的图表。
12. 探索如何将交互式图表(如plotly)嵌入到Excel中。

深入学习pandas:

• 掌握更多高级数据处理技巧,如数据透视表、时间序列分析等。
• 学习如何优化pandas操作,提高数据处理效率。

探索其他Excel库:

• 学习xlwings,它提供了与Excel的更深层次集成。
• 了解pyxlsb,用于处理二进制Excel文件。

自动化报告生成:

• 结合Python的调度工具(如schedule或APScheduler)自动生成定期报告。
• 学习如何通过邮件或其他方式自动分发生成的Excel报告。

数据可视化:

• 学习如何使用matplotlib和seaborn创建更复杂的图表。
• 探索如何将交互式图表(如plotly)嵌入到Excel中。

通过本教程的学习,你应该已经掌握了使用pandas输出Excel的基本技能和高级技巧。继续实践和探索,你将能够创建更加专业和高效的Excel报告,提升你的数据分析能力。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则