|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
引言
在数据分析和处理领域,Excel一直是最受欢迎的工具之一,而Python的pandas库则是数据科学家的得力助手。将这两者结合起来,能够极大地提升我们的数据处理和分析效率。本教程将带你从零开始,全面学习如何使用pandas将数据输出到Excel文件,包括格式设置、多表导出、数据处理等实用技巧,帮助你快速提升数据分析能力。
pandas基础
在开始学习pandas输出Excel之前,我们需要先了解pandas的基础知识。
安装pandas和openpyxl
首先,确保你已经安装了pandas库。如果还没有安装,可以通过以下命令安装:
为了能够将数据输出到Excel文件,我们还需要安装openpyxl或xlsxwriter库:
- pip install openpyxl
- # 或者
- pip install xlsxwriter
复制代码
pandas的基本数据结构
pandas有两个主要的数据结构:Series和DataFrame。
• Series:一维标记数组,能够保存任何数据类型。
• DataFrame:二维标记数据结构,类似于表格或Excel工作表。
下面是创建这两个数据结构的简单示例:
- import pandas as pd
- import numpy as np
- # 创建Series
- s = pd.Series([1, 3, 5, np.nan, 6, 8])
- print("Series示例:")
- print(s)
- # 创建DataFrame
- data = {
- '姓名': ['张三', '李四', '王五', '赵六'],
- '年龄': [25, 30, 35, 40],
- '城市': ['北京', '上海', '广州', '深圳']
- }
- df = pd.DataFrame(data)
- print("\nDataFrame示例:")
- print(df)
复制代码
基础Excel导出
使用to_excel()方法
pandas提供了to_excel()方法,可以将DataFrame导出为Excel文件。下面是一个简单的例子:
- import pandas as pd
- # 创建DataFrame
- data = {
- '姓名': ['张三', '李四', '王五', '赵六'],
- '年龄': [25, 30, 35, 40],
- '城市': ['北京', '上海', '广州', '深圳']
- }
- df = pd.DataFrame(data)
- # 导出到Excel
- df.to_excel('output.xlsx', index=False) # index=False表示不保存索引
复制代码
运行上述代码后,会在当前目录下生成一个名为output.xlsx的Excel文件。
to_excel()方法的常用参数
to_excel()方法有许多参数可以控制输出格式,下面是一些常用参数:
- df.to_excel(
- excel_writer, # 文件路径或ExcelWriter对象
- sheet_name='Sheet1', # 工作表名称
- na_rep='', # 缺失值的表示方式
- float_format='%.2f', # 浮点数的格式
- columns=None, # 要导出的列
- header=True, # 是否包含列名
- index=True, # 是否包含索引
- index_label=None, # 索引列的标签
- startrow=0, # 数据的起始行
- startcol=0, # 数据的起始列
- engine=None, # 使用的引擎('openpyxl'或'xlsxwriter')
- encoding=None, # 编码方式
- inf_rep='inf', # 无穷大的表示方式
- verbose=True, # 是否显示详细信息
- freeze_panes=None # 冻结窗格的位置
- )
复制代码
下面是一个使用这些参数的示例:
- import pandas as pd
- import numpy as np
- # 创建包含各种数据类型的DataFrame
- data = {
- '产品': ['A', 'B', 'C', 'D'],
- '价格': [12.5, 23.756, 8.99, 15.0],
- '销量': [100, 150, None, 200],
- '库存': [50, 75, 30, np.inf]
- }
- df = pd.DataFrame(data)
- # 导出到Excel,使用多种参数
- df.to_excel(
- 'products.xlsx',
- sheet_name='产品信息',
- na_rep='N/A', # 缺失值显示为N/A
- float_format='%.2f', # 浮点数保留两位小数
- columns=['产品', '价格', '销量'], # 只导出这三列
- index=False, # 不导出索引
- startrow=2, # 从第3行开始写入数据
- startcol=1 # 从第2列开始写入数据
- )
复制代码
格式设置
仅仅将数据导出到Excel是不够的,我们通常还需要设置单元格的格式,使数据更加美观和易读。
使用ExcelWriter设置格式
要设置Excel单元格的格式,我们需要使用ExcelWriter对象,并结合openpyxl或xlsxwriter库的功能。
- import pandas as pd
- from openpyxl import load_workbook
- from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
- # 创建DataFrame
- data = {
- '产品': ['A', 'B', 'C', 'D'],
- '价格': [12.5, 23.756, 8.99, 15.0],
- '销量': [100, 150, 80, 200]
- }
- df = pd.DataFrame(data)
- # 导出到Excel
- with pd.ExcelWriter('formatted_output.xlsx', engine='openpyxl') as writer:
- df.to_excel(writer, sheet_name='产品信息', index=False)
-
- # 获取工作簿和工作表对象
- workbook = writer.book
- worksheet = writer.sheets['产品信息']
-
- # 设置标题行的格式
- header_font = Font(name='Arial', bold=True, color='FFFFFF')
- header_fill = PatternFill(start_color='4F81BD', end_color='4F81BD', fill_type='solid')
- header_alignment = Alignment(horizontal='center', vertical='center')
-
- # 设置边框
- thin_border = Border(
- left=Side(style='thin'),
- right=Side(style='thin'),
- top=Side(style='thin'),
- bottom=Side(style='thin')
- )
-
- # 应用格式到标题行
- for cell in worksheet[1]: # 第一行是标题行
- cell.font = header_font
- cell.fill = header_fill
- cell.alignment = header_alignment
- cell.border = thin_border
-
- # 设置数据行的格式
- data_font = Font(name='Arial', size=10)
- data_alignment = Alignment(horizontal='center', vertical='center')
-
- # 应用格式到数据行
- for row in worksheet.iter_rows(min_row=2, max_row=worksheet.max_row):
- for cell in row:
- cell.font = data_font
- cell.alignment = data_alignment
- cell.border = thin_border
-
- # 设置列宽
- worksheet.column_dimensions['A'].width = 10
- worksheet.column_dimensions['B'].width = 10
- worksheet.column_dimensions['C'].width = 10
-
- # 设置价格列为货币格式
- for row in worksheet.iter_rows(min_row=2, max_row=worksheet.max_row, min_col=2, max_col=2):
- for cell in row:
- cell.number_format = '"¥"#,##0.00'
复制代码- import pandas as pd
- # 创建DataFrame
- data = {
- '产品': ['A', 'B', 'C', 'D'],
- '价格': [12.5, 23.756, 8.99, 15.0],
- '销量': [100, 150, 80, 200]
- }
- df = pd.DataFrame(data)
- # 创建ExcelWriter对象
- with pd.ExcelWriter('formatted_output_xlsxwriter.xlsx', engine='xlsxwriter') as writer:
- df.to_excel(writer, sheet_name='产品信息', index=False, startrow=1)
-
- # 获取工作簿和工作表对象
- workbook = writer.book
- worksheet = writer.sheets['产品信息']
-
- # 定义格式
- header_format = workbook.add_format({
- 'bold': True,
- 'text_wrap': True,
- 'valign': 'top',
- 'fg_color': '#4F81BD',
- 'font_color': 'white',
- 'border': 1,
- 'align': 'center'
- })
-
- data_format = workbook.add_format({
- 'border': 1,
- 'align': 'center'
- })
-
- price_format = workbook.add_format({
- 'num_format': '¥#,##0.00',
- 'border': 1,
- 'align': 'center'
- })
-
- # 写入标题行
- for col_num, value in enumerate(df.columns.values):
- worksheet.write(0, col_num, value, header_format)
-
- # 应用格式到数据行
- for row_num in range(1, len(df) + 1):
- # 产品列
- worksheet.write(row_num, 0, df.iloc[row_num-1, 0], data_format)
- # 价格列
- worksheet.write(row_num, 1, df.iloc[row_num-1, 1], price_format)
- # 销量列
- worksheet.write(row_num, 2, df.iloc[row_num-1, 2], data_format)
-
- # 设置列宽
- worksheet.set_column('A:C', 12)
复制代码
条件格式设置
条件格式可以根据单元格的值自动应用不同的格式,使数据更加直观。
- import pandas as pd
- from openpyxl import load_workbook
- from openpyxl.styles import PatternFill
- from openpyxl.formatting.rule import CellIsRule
- # 创建DataFrame
- data = {
- '产品': ['A', 'B', 'C', 'D'],
- '价格': [12.5, 23.756, 8.99, 15.0],
- '销量': [100, 150, 80, 200]
- }
- df = pd.DataFrame(data)
- # 导出到Excel
- with pd.ExcelWriter('conditional_formatting.xlsx', engine='openpyxl') as writer:
- df.to_excel(writer, sheet_name='产品信息', index=False)
-
- # 获取工作簿和工作表对象
- workbook = writer.book
- worksheet = writer.sheets['产品信息']
-
- # 定义条件格式
- # 价格大于15的单元格填充为绿色
- green_fill = PatternFill(start_color='90EE90', end_color='90EE90', fill_type='solid')
- worksheet.conditional_formatting.add(
- 'B2:B5',
- CellIsRule(operator='greaterThan', formula=['15'], fill=green_fill)
- )
-
- # 销量大于等于150的单元格填充为蓝色
- blue_fill = PatternFill(start_color='ADD8E6', end_color='ADD8E6', fill_type='solid')
- worksheet.conditional_formatting.add(
- 'C2:C5',
- CellIsRule(operator='greaterThanOrEqual', formula=['150'], fill=blue_fill)
- )
复制代码- import pandas as pd
- # 创建DataFrame
- data = {
- '产品': ['A', 'B', 'C', 'D'],
- '价格': [12.5, 23.756, 8.99, 15.0],
- '销量': [100, 150, 80, 200]
- }
- df = pd.DataFrame(data)
- # 创建ExcelWriter对象
- with pd.ExcelWriter('conditional_formatting_xlsxwriter.xlsx', engine='xlsxwriter') as writer:
- df.to_excel(writer, sheet_name='产品信息', index=False)
-
- # 获取工作簿和工作表对象
- workbook = writer.book
- worksheet = writer.sheets['产品信息']
-
- # 添加条件格式
- # 价格大于15的单元格填充为绿色
- worksheet.conditional_format(
- 'B2:B5', # 应用范围
- {
- 'type': 'cell',
- 'criteria': '>',
- 'value': 15,
- 'format': workbook.add_format({'bg_color': '#90EE90'})
- }
- )
-
- # 销量大于等于150的单元格填充为蓝色
- worksheet.conditional_format(
- 'C2:C5', # 应用范围
- {
- 'type': 'cell',
- 'criteria': '>=',
- 'value': 150,
- 'format': workbook.add_format({'bg_color': '#ADD8E6'})
- }
- )
-
- # 添加数据条
- worksheet.conditional_format(
- 'C2:C5', # 应用范围
- {
- 'type': 'data_bar',
- 'bar_color': '#63C384'
- }
- )
复制代码
多表导出
在实际应用中,我们经常需要将多个DataFrame导出到同一个Excel文件的不同工作表中。
基本多表导出
- import pandas as pd
- # 创建多个DataFrame
- data1 = {
- '产品': ['A', 'B', 'C', 'D'],
- '价格': [12.5, 23.756, 8.99, 15.0],
- '销量': [100, 150, 80, 200]
- }
- df1 = pd.DataFrame(data1)
- data2 = {
- '月份': ['1月', '2月', '3月', '4月'],
- '收入': [12500, 23756, 8990, 15000],
- '成本': [8000, 15000, 6000, 10000]
- }
- df2 = pd.DataFrame(data2)
- data3 = {
- '地区': ['北京', '上海', '广州', '深圳'],
- '客户数': [120, 150, 80, 200],
- '平均消费': [500, 600, 450, 700]
- }
- df3 = pd.DataFrame(data3)
- # 导出到同一个Excel文件的不同工作表
- with pd.ExcelWriter('multiple_sheets.xlsx') as writer:
- df1.to_excel(writer, sheet_name='产品信息', index=False)
- df2.to_excel(writer, sheet_name='财务数据', index=False)
- df3.to_excel(writer, sheet_name='地区统计', index=False)
复制代码
多表导出并设置格式
- import pandas as pd
- # 创建多个DataFrame
- data1 = {
- '产品': ['A', 'B', 'C', 'D'],
- '价格': [12.5, 23.756, 8.99, 15.0],
- '销量': [100, 150, 80, 200]
- }
- df1 = pd.DataFrame(data1)
- data2 = {
- '月份': ['1月', '2月', '3月', '4月'],
- '收入': [12500, 23756, 8990, 15000],
- '成本': [8000, 15000, 6000, 10000]
- }
- df2 = pd.DataFrame(data2)
- # 创建ExcelWriter对象
- with pd.ExcelWriter('multiple_sheets_formatted.xlsx', engine='xlsxwriter') as writer:
- # 导出第一个DataFrame
- df1.to_excel(writer, sheet_name='产品信息', index=False)
-
- # 获取工作簿和第一个工作表对象
- workbook = writer.book
- worksheet1 = writer.sheets['产品信息']
-
- # 定义格式
- header_format = workbook.add_format({
- 'bold': True,
- 'text_wrap': True,
- 'valign': 'top',
- 'fg_color': '#4F81BD',
- 'font_color': 'white',
- 'border': 1,
- 'align': 'center'
- })
-
- data_format = workbook.add_format({
- 'border': 1,
- 'align': 'center'
- })
-
- price_format = workbook.add_format({
- 'num_format': '¥#,##0.00',
- 'border': 1,
- 'align': 'center'
- })
-
- # 设置第一个工作表的格式
- for col_num, value in enumerate(df1.columns.values):
- worksheet1.write(0, col_num, value, header_format)
-
- for row_num in range(1, len(df1) + 1):
- worksheet1.write(row_num, 0, df1.iloc[row_num-1, 0], data_format)
- worksheet1.write(row_num, 1, df1.iloc[row_num-1, 1], price_format)
- worksheet1.write(row_num, 2, df1.iloc[row_num-1, 2], data_format)
-
- worksheet1.set_column('A:C', 12)
-
- # 导出第二个DataFrame
- df2.to_excel(writer, sheet_name='财务数据', index=False)
-
- # 获取第二个工作表对象
- worksheet2 = writer.sheets['财务数据']
-
- # 设置第二个工作表的格式
- for col_num, value in enumerate(df2.columns.values):
- worksheet2.write(0, col_num, value, header_format)
-
- currency_format = workbook.add_format({
- 'num_format': '¥#,##0',
- 'border': 1,
- 'align': 'center'
- })
-
- for row_num in range(1, len(df2) + 1):
- worksheet2.write(row_num, 0, df2.iloc[row_num-1, 0], data_format)
- worksheet2.write(row_num, 1, df2.iloc[row_num-1, 1], currency_format)
- worksheet2.write(row_num, 2, df2.iloc[row_num-1, 2], currency_format)
-
- worksheet2.set_column('A:C', 12)
-
- # 添加一个汇总工作表
- summary_data = {
- '指标': ['总产品数', '平均价格', '总销量', '总收入', '总成本'],
- '值': [
- len(df1),
- df1['价格'].mean(),
- df1['销量'].sum(),
- df2['收入'].sum(),
- df2['成本'].sum()
- ]
- }
- df_summary = pd.DataFrame(summary_data)
-
- df_summary.to_excel(writer, sheet_name='汇总', index=False)
-
- # 获取汇总工作表对象
- worksheet_summary = writer.sheets['汇总']
-
- # 设置汇总工作表的格式
- for col_num, value in enumerate(df_summary.columns.values):
- worksheet_summary.write(0, col_num, value, header_format)
-
- value_format = workbook.add_format({
- 'num_format': '#,##0.00',
- 'border': 1,
- 'align': 'center'
- })
-
- for row_num in range(1, len(df_summary) + 1):
- worksheet_summary.write(row_num, 0, df_summary.iloc[row_num-1, 0], data_format)
- worksheet_summary.write(row_num, 1, df_summary.iloc[row_num-1, 1], value_format)
-
- worksheet_summary.set_column('A:B', 15)
复制代码
数据处理技巧
在将数据导出到Excel之前,我们通常需要进行一些数据处理操作。下面是一些常见的数据处理技巧。
数据清洗
- import pandas as pd
- import numpy as np
- # 创建包含脏数据的DataFrame
- data = {
- '产品': ['A', 'B', 'C', 'D', 'E', 'F'],
- '价格': [12.5, 23.756, 8.99, 15.0, np.nan, 18.5],
- '销量': [100, 150, 80, 200, 120, None],
- '分类': ['电子产品', '家电', '电子产品', '家电', '家具', '家具']
- }
- df = pd.DataFrame(data)
- print("原始数据:")
- print(df)
- # 1. 处理缺失值
- # 删除包含缺失值的行
- df_dropna = df.dropna()
- print("\n删除缺失值后的数据:")
- print(df_dropna)
- # 填充缺失值
- df_fillna = df.fillna({
- '价格': df['价格'].mean(), # 用平均价格填充缺失的价格
- '销量': 0 # 用0填充缺失的销量
- })
- print("\n填充缺失值后的数据:")
- print(df_fillna)
- # 2. 处理重复值
- # 添加一些重复行
- df_with_duplicates = pd.concat([df, df.iloc[0:2]], ignore_index=True)
- print("\n包含重复值的数据:")
- print(df_with_duplicates)
- # 删除重复行
- df_drop_duplicates = df_with_duplicates.drop_duplicates()
- print("\n删除重复值后的数据:")
- print(df_drop_duplicates)
- # 3. 数据类型转换
- # 将价格转换为整数
- df['价格_整数'] = df['价格'].astype('Int64') # Int64支持NaN值
- print("\n转换数据类型后的数据:")
- print(df)
- # 4. 字符串处理
- # 在产品名称前添加"产品-"前缀
- df['产品_新名称'] = '产品-' + df['产品']
- print("\n字符串处理后的数据:")
- print(df)
- # 5. 数据筛选
- # 筛选价格大于15的产品
- df_filtered = df[df['价格'] > 15]
- print("\n价格大于15的产品:")
- print(df_filtered)
- # 6. 数据分组
- # 按分类分组并计算平均价格和总销量
- df_grouped = df.groupby('分类').agg({
- '价格': 'mean',
- '销量': 'sum'
- })
- print("\n按分类分组统计:")
- print(df_grouped)
复制代码
数据转换和计算
- import pandas as pd
- # 创建DataFrame
- data = {
- '产品': ['A', 'B', 'C', 'D'],
- '成本': [10, 15, 8, 12],
- '售价': [15, 20, 12, 18],
- '销量': [100, 150, 80, 200]
- }
- df = pd.DataFrame(data)
- print("原始数据:")
- print(df)
- # 1. 添加计算列
- # 计算利润
- df['利润'] = df['售价'] - df['成本']
- # 计算利润率
- df['利润率'] = (df['利润'] / df['成本']) * 100
- # 计算总收入
- df['总收入'] = df['售价'] * df['销量']
- # 计算总利润
- df['总利润'] = df['利润'] * df['销量']
- print("\n添加计算列后的数据:")
- print(df)
- # 2. 应用函数
- # 定义一个函数来评估产品表现
- def evaluate_performance(row):
- if row['利润率'] > 50:
- return '优秀'
- elif row['利润率'] > 30:
- return '良好'
- elif row['利润率'] > 10:
- return '一般'
- else:
- return '较差'
- # 应用函数
- df['表现评估'] = df.apply(evaluate_performance, axis=1)
- print("\n应用函数后的数据:")
- print(df)
- # 3. 数据排序
- # 按总利润降序排序
- df_sorted = df.sort_values('总利润', ascending=False)
- print("\n按总利润降序排序:")
- print(df_sorted)
- # 4. 数据排名
- # 添加利润排名列
- df['利润排名'] = df['总利润'].rank(ascending=False, method='dense').astype(int)
- print("\n添加排名后的数据:")
- print(df)
- # 5. 数据透视表
- # 创建一个更大的数据集以便演示透视表
- data_large = {
- '产品': ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D', 'A', 'B', 'C', 'D'],
- '地区': ['北京', '北京', '北京', '北京', '上海', '上海', '上海', '上海', '广州', '广州', '广州', '广州'],
- '季度': ['Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1', 'Q1'],
- '销量': [100, 150, 80, 200, 120, 180, 90, 220, 80, 140, 70, 190],
- '收入': [1500, 3000, 960, 3600, 1800, 3600, 1080, 3960, 1200, 2800, 840, 3420]
- }
- df_large = pd.DataFrame(data_large)
- # 创建透视表
- pivot_table = pd.pivot_table(
- df_large,
- values=['销量', '收入'],
- index=['地区'],
- columns=['产品'],
- aggfunc='sum',
- fill_value=0
- )
- print("\n数据透视表:")
- print(pivot_table)
复制代码
数据合并
- import pandas as pd
- # 创建两个DataFrame
- df1 = pd.DataFrame({
- '产品ID': [1, 2, 3, 4],
- '产品名称': ['A', 'B', 'C', 'D'],
- '成本': [10, 15, 8, 12]
- })
- df2 = pd.DataFrame({
- '产品ID': [1, 2, 3, 4, 5], # 注意这里多了一个产品ID为5的行
- '售价': [15, 20, 12, 18, 25],
- '分类': ['电子产品', '家电', '电子产品', '家电', '家具']
- })
- print("DataFrame 1:")
- print(df1)
- print("\nDataFrame 2:")
- print(df2)
- # 1. 内连接 (inner join)
- # 只保留两个DataFrame中都存在的产品ID
- df_inner = pd.merge(df1, df2, on='产品ID', how='inner')
- print("\n内连接结果:")
- print(df_inner)
- # 2. 左连接 (left join)
- # 保留左边的DataFrame中的所有行
- df_left = pd.merge(df1, df2, on='产品ID', how='left')
- print("\n左连接结果:")
- print(df_left)
- # 3. 右连接 (right join)
- # 保留右边的DataFrame中的所有行
- df_right = pd.merge(df1, df2, on='产品ID', how='right')
- print("\n右连接结果:")
- print(df_right)
- # 4. 外连接 (outer join)
- # 保留两个DataFrame中的所有行
- df_outer = pd.merge(df1, df2, on='产品ID', how='outer')
- print("\n外连接结果:")
- print(df_outer)
- # 5. 纵向合并 (concat)
- # 创建两个具有相同列的DataFrame
- df3 = pd.DataFrame({
- '产品ID': [5, 6],
- '产品名称': ['E', 'F'],
- '成本': [18, 20]
- })
- # 纵向合并
- df_concat = pd.concat([df1, df3], ignore_index=True)
- print("\n纵向合并结果:")
- print(df_concat)
复制代码
高级技巧
使用Excel公式
- import pandas as pd
- # 创建DataFrame
- data = {
- '产品': ['A', 'B', 'C', 'D'],
- '成本': [10, 15, 8, 12],
- '售价': [15, 20, 12, 18],
- '销量': [100, 150, 80, 200]
- }
- df = pd.DataFrame(data)
- # 创建ExcelWriter对象
- with pd.ExcelWriter('excel_formulas.xlsx', engine='xlsxwriter') as writer:
- # 导出DataFrame
- df.to_excel(writer, sheet_name='产品信息', index=False)
-
- # 获取工作簿和工作表对象
- workbook = writer.book
- worksheet = writer.sheets['产品信息']
-
- # 添加公式列
- # 添加利润列(售价-成本)
- worksheet.write(1, 5, '利润') # 列标题
- for row_num in range(2, len(df) + 2):
- worksheet.write_formula(
- row_num, 5, # F列
- f'=C{row_num}-B{row_num}', # 售价-成本
- workbook.add_format({'num_format': '#,##0.00'})
- )
-
- # 添加利润率列(利润/成本)
- worksheet.write(1, 6, '利润率') # 列标题
- for row_num in range(2, len(df) + 2):
- worksheet.write_formula(
- row_num, 6, # G列
- f'=F{row_num}/B{row_num}', # 利润/成本
- workbook.add_format({'num_format': '0.00%'})
- )
-
- # 添加总收入列(售价*销量)
- worksheet.write(1, 7, '总收入') # 列标题
- for row_num in range(2, len(df) + 2):
- worksheet.write_formula(
- row_num, 7, # H列
- f'=C{row_num}*D{row_num}', # 售价*销量
- workbook.add_format({'num_format': '¥#,##0'})
- )
-
- # 添加总利润列(利润*销量)
- worksheet.write(1, 8, '总利润') # 列标题
- for row_num in range(2, len(df) + 2):
- worksheet.write_formula(
- row_num, 8, # I列
- f'=F{row_num}*D{row_num}', # 利润*销量
- workbook.add_format({'num_format': '¥#,##0'})
- )
-
- # 添加汇总行
- last_row = len(df) + 2
- worksheet.write(last_row, 0, '总计')
-
- # 使用SUM函数计算总销量
- worksheet.write_formula(
- last_row, 3, # D列
- f'=SUM(D2:D{last_row-1})',
- workbook.add_format({'bold': True, 'num_format': '#,##0'})
- )
-
- # 使用SUM函数计算总收入
- worksheet.write_formula(
- last_row, 7, # H列
- f'=SUM(H2:H{last_row-1})',
- workbook.add_format({'bold': True, 'num_format': '¥#,##0'})
- )
-
- # 使用SUM函数计算总利润
- worksheet.write_formula(
- last_row, 8, # I列
- f'=SUM(I2:I{last_row-1})',
- workbook.add_format({'bold': True, 'num_format': '¥#,##0'})
- )
-
- # 设置列宽
- worksheet.set_column('A:A', 10)
- worksheet.set_column('B:I', 12)
复制代码
添加图表
- import pandas as pd
- # 创建DataFrame
- data = {
- '月份': ['1月', '2月', '3月', '4月', '5月', '6月'],
- '销售额': [12000, 15000, 18000, 14000, 20000, 22000],
- '成本': [8000, 10000, 12000, 9000, 13000, 14000],
- '利润': [4000, 5000, 6000, 5000, 7000, 8000]
- }
- df = pd.DataFrame(data)
- # 创建ExcelWriter对象
- with pd.ExcelWriter('excel_charts.xlsx', engine='xlsxwriter') as writer:
- # 导出DataFrame
- df.to_excel(writer, sheet_name='销售数据', index=False)
-
- # 获取工作簿和工作表对象
- workbook = writer.book
- worksheet = writer.sheets['销售数据']
-
- # 定义图表格式
- chart_format = workbook.add_format({
- 'bold': True,
- 'font_color': 'white',
- 'bg_color': '#4F81BD',
- 'border': 1,
- 'align': 'center'
- })
-
- # 设置标题行格式
- for col_num, value in enumerate(df.columns.values):
- worksheet.write(0, col_num, value, chart_format)
-
- # 设置数据行格式
- data_format = workbook.add_format({
- 'border': 1,
- 'align': 'center'
- })
-
- currency_format = workbook.add_format({
- 'num_format': '¥#,##0',
- 'border': 1,
- 'align': 'center'
- })
-
- for row_num in range(1, len(df) + 1):
- worksheet.write(row_num, 0, df.iloc[row_num-1, 0], data_format)
- worksheet.write(row_num, 1, df.iloc[row_num-1, 1], currency_format)
- worksheet.write(row_num, 2, df.iloc[row_num-1, 2], currency_format)
- worksheet.write(row_num, 3, df.iloc[row_num-1, 3], currency_format)
-
- # 设置列宽
- worksheet.set_column('A:D', 12)
-
- # 创建柱状图
- chart_column = workbook.add_chart({'type': 'column'})
-
- # 配置柱状图数据系列
- chart_column.add_series({
- 'name': '销售数据!$B$1',
- 'categories': '销售数据!$A$2:$A$7',
- 'values': '销售数据!$B$2:$B$7',
- 'fill': {'color': '#4F81BD'},
- })
-
- chart_column.add_series({
- 'name': '销售数据!$C$1',
- 'categories': '销售数据!$A$2:$A$7',
- 'values': '销售数据!$C$2:$C$7',
- 'fill': {'color': '#9BBB59'},
- })
-
- chart_column.add_series({
- 'name': '销售数据!$D$1',
- 'categories': '销售数据!$A$2:$A$7',
- 'values': '销售数据!$D$2:$D$7',
- 'fill': {'color': '#C0504D'},
- })
-
- # 设置图表标题和样式
- chart_column.set_title({'name': '月度销售数据'})
- chart_column.set_x_axis({'name': '月份'})
- chart_column.set_y_axis({'name': '金额 (¥)'})
- chart_column.set_legend({'position': 'top'})
-
- # 插入柱状图
- worksheet.insert_chart('F2', chart_column, {'x_offset': 25, 'y_offset': 10})
-
- # 创建折线图
- chart_line = workbook.add_chart({'type': 'line'})
-
- # 配置折线图数据系列
- chart_line.add_series({
- 'name': '销售数据!$B$1',
- 'categories': '销售数据!$A$2:$A$7',
- 'values': '销售数据!$B$2:$B$7',
- 'line': {'color': '#4F81BD', 'width': 3},
- 'marker': {'type': 'circle', 'size': 6, 'border': {'color': '#4F81BD'}, 'fill': {'color': '#4F81BD'}}
- })
-
- chart_line.add_series({
- 'name': '销售数据!$C$1',
- 'categories': '销售数据!$A$2:$A$7',
- 'values': '销售数据!$C$2:$C$7',
- 'line': {'color': '#9BBB59', 'width': 3},
- 'marker': {'type': 'square', 'size': 6, 'border': {'color': '#9BBB59'}, 'fill': {'color': '#9BBB59'}}
- })
-
- chart_line.add_series({
- 'name': '销售数据!$D$1',
- 'categories': '销售数据!$A$2:$A$7',
- 'values': '销售数据!$D$2:$D$7',
- 'line': {'color': '#C0504D', 'width': 3},
- 'marker': {'type': 'triangle', 'size': 6, 'border': {'color': '#C0504D'}, 'fill': {'color': '#C0504D'}}
- })
-
- # 设置图表标题和样式
- chart_line.set_title({'name': '月度销售趋势'})
- chart_line.set_x_axis({'name': '月份'})
- chart_line.set_y_axis({'name': '金额 (¥)'})
- chart_line.set_legend({'position': 'top'})
-
- # 插入折线图
- worksheet.insert_chart('F20', chart_line, {'x_offset': 25, 'y_offset': 10})
-
- # 创建饼图
- chart_pie = workbook.add_chart({'type': 'pie'})
-
- # 配置饼图数据系列
- chart_pie.add_series({
- 'name': '销售数据!$B$1',
- 'categories': '销售数据!$A$2:$A$7',
- 'values': '销售数据!$B$2:$B$7',
- 'data_labels': {'value': True, 'percentage': True},
- })
-
- # 设置图表标题和样式
- chart_pie.set_title({'name': '销售额分布'})
- chart_pie.set_legend({'position': 'right'})
-
- # 插入饼图
- worksheet.insert_chart('F38', chart_pie, {'x_offset': 25, 'y_offset': 10})
复制代码
数据验证
- import pandas as pd
- # 创建DataFrame
- data = {
- '产品': ['A', 'B', 'C', 'D'],
- '价格': [12.5, 23.756, 8.99, 15.0],
- '库存': [100, 150, 80, 200]
- }
- df = pd.DataFrame(data)
- # 创建ExcelWriter对象
- with pd.ExcelWriter('data_validation.xlsx', engine='xlsxwriter') as writer:
- # 导出DataFrame
- df.to_excel(writer, sheet_name='产品信息', index=False)
-
- # 获取工作簿和工作表对象
- workbook = writer.book
- worksheet = writer.sheets['产品信息']
-
- # 设置标题行格式
- header_format = workbook.add_format({
- 'bold': True,
- 'text_wrap': True,
- 'valign': 'top',
- 'fg_color': '#4F81BD',
- 'font_color': 'white',
- 'border': 1,
- 'align': 'center'
- })
-
- # 设置数据行格式
- data_format = workbook.add_format({
- 'border': 1,
- 'align': 'center'
- })
-
- # 应用格式
- for col_num, value in enumerate(df.columns.values):
- worksheet.write(0, col_num, value, header_format)
-
- for row_num in range(1, len(df) + 1):
- for col_num in range(len(df.columns)):
- worksheet.write(row_num, col_num, df.iloc[row_num-1, col_num], data_format)
-
- # 设置列宽
- worksheet.set_column('A:C', 12)
-
- # 添加数据验证
- # 1. 产品列:下拉列表
- worksheet.data_validation(
- 'A2:A100', # 应用范围
- {
- 'validate': 'list',
- 'source': ['A', 'B', 'C', 'D', 'E', 'F'],
- 'input_title': '选择产品',
- 'input_message': '请从下拉列表中选择产品',
- }
- )
-
- # 2. 价格列:数值范围
- worksheet.data_validation(
- 'B2:B100', # 应用范围
- {
- 'validate': 'decimal',
- 'criteria': 'between',
- 'minimum': 0,
- 'maximum': 100,
- 'input_title': '输入价格',
- 'input_message': '请输入0到100之间的价格',
- 'error_title': '输入错误',
- 'error_message': '价格必须在0到100之间'
- }
- )
-
- # 3. 库存列:整数范围
- worksheet.data_validation(
- 'C2:C100', # 应用范围
- {
- 'validate': 'integer',
- 'criteria': 'between',
- 'minimum': 0,
- 'maximum': 1000,
- 'input_title': '输入库存',
- 'input_message': '请输入0到1000之间的整数库存',
- 'error_title': '输入错误',
- 'error_message': '库存必须是0到1000之间的整数'
- }
- )
-
- # 添加一个新工作表,用于数据输入
- worksheet_input = workbook.add_worksheet('数据输入')
-
- # 设置表头
- headers = ['产品', '价格', '库存']
- for col_num, header in enumerate(headers):
- worksheet_input.write(0, col_num, header, header_format)
-
- # 设置列宽
- worksheet_input.set_column('A:C', 12)
-
- # 应用数据验证
- # 产品列:下拉列表
- worksheet_input.data_validation(
- 'A2:A100', # 应用范围
- {
- 'validate': 'list',
- 'source': ['A', 'B', 'C', 'D', 'E', 'F'],
- 'input_title': '选择产品',
- 'input_message': '请从下拉列表中选择产品',
- }
- )
-
- # 价格列:数值范围
- worksheet_input.data_validation(
- 'B2:B100', # 应用范围
- {
- 'validate': 'decimal',
- 'criteria': 'between',
- 'minimum': 0,
- 'maximum': 100,
- 'input_title': '输入价格',
- 'input_message': '请输入0到100之间的价格',
- 'error_title': '输入错误',
- 'error_message': '价格必须在0到100之间'
- }
- )
-
- # 库存列:整数范围
- worksheet_input.data_validation(
- 'C2:C100', # 应用范围
- {
- 'validate': 'integer',
- 'criteria': 'between',
- 'minimum': 0,
- 'maximum': 1000,
- 'input_title': '输入库存',
- 'input_message': '请输入0到1000之间的整数库存',
- 'error_title': '输入错误',
- 'error_message': '库存必须是0到1000之间的整数'
- }
- )
-
- # 添加一些示例数据
- worksheet_input.write(1, 0, 'A', data_format)
- worksheet_input.write(1, 1, 15.5, data_format)
- worksheet_input.write(1, 2, 100, data_format)
-
- worksheet_input.write(2, 0, 'B', data_format)
- worksheet_input.write(2, 1, 25.0, data_format)
- worksheet_input.write(2, 2, 150, data_format)
复制代码
实际案例
下面是一个完整的实际案例,展示如何从数据收集、处理、分析到最终导出为格式化的Excel报告的整个过程。
- import pandas as pd
- import numpy as np
- from datetime import datetime, timedelta
- # 1. 数据生成和收集
- # 模拟生成销售数据
- def generate_sales_data(start_date, end_date):
- date_range = pd.date_range(start=start_date, end=end_date)
- products = ['A', 'B', 'C', 'D', 'E']
- regions = ['北京', '上海', '广州', '深圳', '成都']
-
- data = []
- for date in date_range:
- for product in products:
- for region in regions:
- # 生成随机数据
- base_price = np.random.uniform(10, 50)
- quantity = np.random.randint(10, 100)
- discount = np.random.choice([0, 0.05, 0.1, 0.15, 0.2], p=[0.5, 0.2, 0.15, 0.1, 0.05])
-
- # 计算销售额和利润
- cost = base_price * 0.6 # 成本是售价的60%
- price = base_price * (1 - discount)
- sales = price * quantity
- profit = (price - cost) * quantity
-
- data.append({
- '日期': date,
- '产品': product,
- '地区': region,
- '成本': cost,
- '售价': price,
- '折扣': discount,
- '销量': quantity,
- '销售额': sales,
- '利润': profit
- })
-
- return pd.DataFrame(data)
- # 生成过去一年的销售数据
- end_date = datetime.now().date()
- start_date = end_date - timedelta(days=365)
- sales_data = generate_sales_data(start_date, end_date)
- print("生成的销售数据示例:")
- print(sales_data.head())
- # 2. 数据清洗和预处理
- # 检查缺失值
- print("\n缺失值检查:")
- print(sales_data.isnull().sum())
- # 检查数据类型
- print("\n数据类型:")
- print(sales_data.dtypes)
- # 转换日期列为datetime类型
- sales_data['日期'] = pd.to_datetime(sales_data['日期'])
- # 添加月份和季度列
- sales_data['月份'] = sales_data['日期'].dt.to_period('M')
- sales_data['季度'] = sales_data['日期'].dt.to_period('Q')
- print("\n添加月份和季度后的数据示例:")
- print(sales_data.head())
- # 3. 数据分析
- # 按产品分析
- product_analysis = sales_data.groupby('产品').agg({
- '销量': 'sum',
- '销售额': 'sum',
- '利润': 'sum',
- '折扣': 'mean'
- }).reset_index()
- # 添加利润率列
- product_analysis['利润率'] = (product_analysis['利润'] / product_analysis['销售额']) * 100
- print("\n产品分析:")
- print(product_analysis)
- # 按地区分析
- region_analysis = sales_data.groupby('地区').agg({
- '销量': 'sum',
- '销售额': 'sum',
- '利润': 'sum'
- }).reset_index()
- # 添加利润率列
- region_analysis['利润率'] = (region_analysis['利润'] / region_analysis['销售额']) * 100
- print("\n地区分析:")
- print(region_analysis)
- # 按月份分析
- monthly_analysis = sales_data.groupby('月份').agg({
- '销量': 'sum',
- '销售额': 'sum',
- '利润': 'sum'
- }).reset_index()
- # 将月份转换为字符串格式
- monthly_analysis['月份'] = monthly_analysis['月份'].astype(str)
- # 添加利润率列
- monthly_analysis['利润率'] = (monthly_analysis['利润'] / monthly_analysis['销售额']) * 100
- print("\n月度分析:")
- print(monthly_analysis.head())
- # 按季度分析
- quarterly_analysis = sales_data.groupby('季度').agg({
- '销量': 'sum',
- '销售额': 'sum',
- '利润': 'sum'
- }).reset_index()
- # 将季度转换为字符串格式
- quarterly_analysis['季度'] = quarterly_analysis['季度'].astype(str)
- # 添加利润率列
- quarterly_analysis['利润率'] = (quarterly_analysis['利润'] / quarterly_analysis['销售额']) * 100
- print("\n季度分析:")
- print(quarterly_analysis)
- # 4. 导出Excel报告
- # 创建ExcelWriter对象
- with pd.ExcelWriter('sales_report.xlsx', engine='xlsxwriter') as writer:
- # 定义格式
- header_format = writer.book.add_format({
- 'bold': True,
- 'text_wrap': True,
- 'valign': 'top',
- 'fg_color': '#4F81BD',
- 'font_color': 'white',
- 'border': 1,
- 'align': 'center'
- })
-
- data_format = writer.book.add_format({
- 'border': 1,
- 'align': 'center'
- })
-
- currency_format = writer.book.add_format({
- 'num_format': '¥#,##0',
- 'border': 1,
- 'align': 'center'
- })
-
- percentage_format = writer.book.add_format({
- 'num_format': '0.00%',
- 'border': 1,
- 'align': 'center'
- })
-
- # 导出原始数据
- sales_data.to_excel(writer, sheet_name='原始数据', index=False)
- worksheet_raw = writer.sheets['原始数据']
-
- # 设置原始数据格式
- for col_num, value in enumerate(sales_data.columns.values):
- worksheet_raw.write(0, col_num, value, header_format)
-
- for row_num in range(1, len(sales_data) + 1):
- for col_num, col_name in enumerate(sales_data.columns):
- if col_name in ['成本', '售价', '销售额', '利润']:
- worksheet_raw.write(row_num, col_num, sales_data.iloc[row_num-1, col_num], currency_format)
- elif col_name == '折扣':
- worksheet_raw.write(row_num, col_num, sales_data.iloc[row_num-1, col_num], percentage_format)
- else:
- worksheet_raw.write(row_num, col_num, sales_data.iloc[row_num-1, col_num], data_format)
-
- # 设置列宽
- worksheet_raw.set_column('A:A', 12) # 日期
- worksheet_raw.set_column('B:B', 8) # 产品
- worksheet_raw.set_column('C:C', 8) # 地区
- worksheet_raw.set_column('D:G', 10) # 成本、售价、折扣、销量
- worksheet_raw.set_column('H:I', 12) # 销售额、利润
-
- # 导出产品分析
- product_analysis.to_excel(writer, sheet_name='产品分析', index=False)
- worksheet_product = writer.sheets['产品分析']
-
- # 设置产品分析格式
- for col_num, value in enumerate(product_analysis.columns.values):
- worksheet_product.write(0, col_num, value, header_format)
-
- for row_num in range(1, len(product_analysis) + 1):
- worksheet_product.write(row_num, 0, product_analysis.iloc[row_num-1, 0], data_format) # 产品
- worksheet_product.write(row_num, 1, product_analysis.iloc[row_num-1, 1], data_format) # 销量
- worksheet_product.write(row_num, 2, product_analysis.iloc[row_num-1, 2], currency_format) # 销售额
- worksheet_product.write(row_num, 3, product_analysis.iloc[row_num-1, 3], currency_format) # 利润
- worksheet_product.write(row_num, 4, product_analysis.iloc[row_num-1, 4], percentage_format) # 利润率
-
- # 设置列宽
- worksheet_product.set_column('A:A', 8) # 产品
- worksheet_product.set_column('B:B', 10) # 销量
- worksheet_product.set_column('C:E', 12) # 销售额、利润、利润率
-
- # 添加产品分析图表
- chart_product = writer.book.add_chart({'type': 'column'})
-
- # 配置图表数据系列
- chart_product.add_series({
- 'name': '产品分析!$C$1',
- 'categories': '产品分析!$A$2:$A$6',
- 'values': '产品分析!$C$2:$C$6',
- 'fill': {'color': '#4F81BD'},
- })
-
- chart_product.add_series({
- 'name': '产品分析!$D$1',
- 'categories': '产品分析!$A$2:$A$6',
- 'values': '产品分析!$D$2:$D$6',
- 'fill': {'color': '#9BBB59'},
- })
-
- # 设置图表标题和样式
- chart_product.set_title({'name': '产品销售额与利润'})
- chart_product.set_x_axis({'name': '产品'})
- chart_product.set_y_axis({'name': '金额 (¥)'})
- chart_product.set_legend({'position': 'top'})
-
- # 插入图表
- worksheet_product.insert_chart('G2', chart_product, {'x_offset': 25, 'y_offset': 10})
-
- # 导出地区分析
- region_analysis.to_excel(writer, sheet_name='地区分析', index=False)
- worksheet_region = writer.sheets['地区分析']
-
- # 设置地区分析格式
- for col_num, value in enumerate(region_analysis.columns.values):
- worksheet_region.write(0, col_num, value, header_format)
-
- for row_num in range(1, len(region_analysis) + 1):
- worksheet_region.write(row_num, 0, region_analysis.iloc[row_num-1, 0], data_format) # 地区
- worksheet_region.write(row_num, 1, region_analysis.iloc[row_num-1, 1], data_format) # 销量
- worksheet_region.write(row_num, 2, region_analysis.iloc[row_num-1, 2], currency_format) # 销售额
- worksheet_region.write(row_num, 3, region_analysis.iloc[row_num-1, 3], currency_format) # 利润
- worksheet_region.write(row_num, 4, region_analysis.iloc[row_num-1, 4], percentage_format) # 利润率
-
- # 设置列宽
- worksheet_region.set_column('A:A', 8) # 地区
- worksheet_region.set_column('B:B', 10) # 销量
- worksheet_region.set_column('C:E', 12) # 销售额、利润、利润率
-
- # 添加地区分析图表
- chart_region = writer.book.add_chart({'type': 'pie'})
-
- # 配置图表数据系列
- chart_region.add_series({
- 'name': '地区分析!$C$1',
- 'categories': '地区分析!$A$2:$A$6',
- 'values': '地区分析!$C$2:$C$6',
- 'data_labels': {'value': True, 'percentage': True},
- })
-
- # 设置图表标题和样式
- chart_region.set_title({'name': '地区销售额分布'})
- chart_region.set_legend({'position': 'right'})
-
- # 插入图表
- worksheet_region.insert_chart('G2', chart_region, {'x_offset': 25, 'y_offset': 10})
-
- # 导出月度分析
- monthly_analysis.to_excel(writer, sheet_name='月度分析', index=False)
- worksheet_monthly = writer.sheets['月度分析']
-
- # 设置月度分析格式
- for col_num, value in enumerate(monthly_analysis.columns.values):
- worksheet_monthly.write(0, col_num, value, header_format)
-
- for row_num in range(1, len(monthly_analysis) + 1):
- worksheet_monthly.write(row_num, 0, monthly_analysis.iloc[row_num-1, 0], data_format) # 月份
- worksheet_monthly.write(row_num, 1, monthly_analysis.iloc[row_num-1, 1], data_format) # 销量
- worksheet_monthly.write(row_num, 2, monthly_analysis.iloc[row_num-1, 2], currency_format) # 销售额
- worksheet_monthly.write(row_num, 3, monthly_analysis.iloc[row_num-1, 3], currency_format) # 利润
- worksheet_monthly.write(row_num, 4, monthly_analysis.iloc[row_num-1, 4], percentage_format) # 利润率
-
- # 设置列宽
- worksheet_monthly.set_column('A:A', 10) # 月份
- worksheet_monthly.set_column('B:B', 10) # 销量
- worksheet_monthly.set_column('C:E', 12) # 销售额、利润、利润率
-
- # 添加月度分析图表
- chart_monthly = writer.book.add_chart({'type': 'line'})
-
- # 配置图表数据系列
- chart_monthly.add_series({
- 'name': '月度分析!$C$1',
- 'categories': '月度分析!$A$2:$A$13',
- 'values': '月度分析!$C$2:$C$13',
- 'line': {'color': '#4F81BD', 'width': 3},
- 'marker': {'type': 'circle', 'size': 6, 'border': {'color': '#4F81BD'}, 'fill': {'color': '#4F81BD'}}
- })
-
- chart_monthly.add_series({
- 'name': '月度分析!$D$1',
- 'categories': '月度分析!$A$2:$A$13',
- 'values': '月度分析!$D$2:$D$13',
- 'line': {'color': '#9BBB59', 'width': 3},
- 'marker': {'type': 'square', 'size': 6, 'border': {'color': '#9BBB59'}, 'fill': {'color': '#9BBB59'}}
- })
-
- # 设置图表标题和样式
- chart_monthly.set_title({'name': '月度销售趋势'})
- chart_monthly.set_x_axis({'name': '月份'})
- chart_monthly.set_y_axis({'name': '金额 (¥)'})
- chart_monthly.set_legend({'position': 'top'})
-
- # 插入图表
- worksheet_monthly.insert_chart('G2', chart_monthly, {'x_offset': 25, 'y_offset': 10})
-
- # 导出季度分析
- quarterly_analysis.to_excel(writer, sheet_name='季度分析', index=False)
- worksheet_quarterly = writer.sheets['季度分析']
-
- # 设置季度分析格式
- for col_num, value in enumerate(quarterly_analysis.columns.values):
- worksheet_quarterly.write(0, col_num, value, header_format)
-
- for row_num in range(1, len(quarterly_analysis) + 1):
- worksheet_quarterly.write(row_num, 0, quarterly_analysis.iloc[row_num-1, 0], data_format) # 季度
- worksheet_quarterly.write(row_num, 1, quarterly_analysis.iloc[row_num-1, 1], data_format) # 销量
- worksheet_quarterly.write(row_num, 2, quarterly_analysis.iloc[row_num-1, 2], currency_format) # 销售额
- worksheet_quarterly.write(row_num, 3, quarterly_analysis.iloc[row_num-1, 3], currency_format) # 利润
- worksheet_quarterly.write(row_num, 4, quarterly_analysis.iloc[row_num-1, 4], percentage_format) # 利润率
-
- # 设置列宽
- worksheet_quarterly.set_column('A:A', 10) # 季度
- worksheet_quarterly.set_column('B:B', 10) # 销量
- worksheet_quarterly.set_column('C:E', 12) # 销售额、利润、利润率
-
- # 添加季度分析图表
- chart_quarterly = writer.book.add_chart({'type': 'column'})
-
- # 配置图表数据系列
- chart_quarterly.add_series({
- 'name': '季度分析!$C$1',
- 'categories': '季度分析!$A$2:$A$5',
- 'values': '季度分析!$C$2:$C$5',
- 'fill': {'color': '#4F81BD'},
- })
-
- chart_quarterly.add_series({
- 'name': '季度分析!$D$1',
- 'categories': '季度分析!$A$2:$A$5',
- 'values': '季度分析!$D$2:$D$5',
- 'fill': {'color': '#9BBB59'},
- })
-
- # 设置图表标题和样式
- chart_quarterly.set_title({'name': '季度销售对比'})
- chart_quarterly.set_x_axis({'name': '季度'})
- chart_quarterly.set_y_axis({'name': '金额 (¥)'})
- chart_quarterly.set_legend({'position': 'top'})
-
- # 插入图表
- worksheet_quarterly.insert_chart('G2', chart_quarterly, {'x_offset': 25, 'y_offset': 10})
-
- # 添加汇总工作表
- summary_data = {
- '指标': [
- '总销售额',
- '总利润',
- '平均利润率',
- '总销量',
- '最畅销产品',
- '最佳销售地区',
- '最佳销售月份',
- '最佳销售季度'
- ],
- '值': [
- sales_data['销售额'].sum(),
- sales_data['利润'].sum(),
- (sales_data['利润'].sum() / sales_data['销售额'].sum()),
- sales_data['销量'].sum(),
- product_analysis.loc[product_analysis['销售额'].idxmax(), '产品'],
- region_analysis.loc[region_analysis['销售额'].idxmax(), '地区'],
- monthly_analysis.loc[monthly_analysis['销售额'].idxmax(), '月份'],
- quarterly_analysis.loc[quarterly_analysis['销售额'].idxmax(), '季度']
- ]
- }
- df_summary = pd.DataFrame(summary_data)
-
- df_summary.to_excel(writer, sheet_name='汇总', index=False)
- worksheet_summary = writer.sheets['汇总']
-
- # 设置汇总格式
- for col_num, value in enumerate(df_summary.columns.values):
- worksheet_summary.write(0, col_num, value, header_format)
-
- for row_num in range(1, len(df_summary) + 1):
- worksheet_summary.write(row_num, 0, df_summary.iloc[row_num-1, 0], data_format) # 指标
-
- # 根据指标类型设置不同的格式
- if row_num in [1, 2, 4]: # 数值指标
- worksheet_summary.write(row_num, 1, df_summary.iloc[row_num-1, 1], currency_format)
- elif row_num == 3: # 百分比指标
- worksheet_summary.write(row_num, 1, df_summary.iloc[row_num-1, 1], percentage_format)
- else: # 文本指标
- worksheet_summary.write(row_num, 1, df_summary.iloc[row_num-1, 1], data_format)
-
- # 设置列宽
- worksheet_summary.set_column('A:A', 15) # 指标
- worksheet_summary.set_column('B:B', 15) # 值
- 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报告,提升你的数据分析能力。 |
|