数据分析完了总得有个产出——给老板看、给自己留档、做报告,都需要一份规整的报表。这一篇教你把分析结果导出成专业的 Excel 文件,把前面学的读取、清洗、分组、筛选全部串起来,最后落地到一份漂漂亮亮的报表上。
先补上CSV这课
前面用过to_csv():
df.to_csv('结果.csv',index=False,encoding='utf-8-sig')CSV 纯文本、兼容性无敌,但没有格式、不能分 Sheet、不能做透视表。自己存数据、给程序读够用;要给人看、做报告、交老板,还是 Excel 专业。
最基础的导出,一行代码
importpandasaspd df.to_excel('销售报表.xlsx',index=False)前提是先装openpyxl(Pandas 底层靠它写 Excel):
pipinstallopenpyxlindex=False一定要加——不加的话导出的第一列是 0、1、2、3……的索引,老板看了会问你这列啥意思。
一个Excel放多张表
一份报表往往不止一张表(总览、明细、趋势),用pd.ExcelWriter:
importpandasaspd df_overview=pd.DataFrame({'类别':['电子产品','服装','食品'],'销售额':[12500,8900,6700],'订单数':[156,230,310]})df_monthly=pd.DataFrame({'月份':['1月','2月','3月'],'销售额':[28100,31200,29800]})withpd.ExcelWriter('销售报表.xlsx',engine='openpyxl')aswriter:df_overview.to_excel(writer,sheet_name='总览',index=False)df_monthly.to_excel(writer,sheet_name='月度趋势',index=False)用with把写入包起来,每个 DataFrame 指定一个sheet_name。with 会自动保存关闭,不用手动writer.save()。
让报表看起来像那么回事
表头加个颜色、列宽调一下、金额加货币符号,瞬间就专业了。用openpyxl来做。
表头加粗加背景色
fromopenpyxlimportload_workbookfromopenpyxl.stylesimportFont,PatternFill,Alignment wb=load_workbook('销售报表.xlsx')ws=wb['总览']header_font=Font(bold=True,color='FFFFFF')header_fill=PatternFill(start_color='4472C4',end_color='4472C4',fill_type='solid')center=Alignment(horizontal='center',vertical='center')forcellinws[1]:# 遍历第一行表头cell.font=header_font cell.fill=header_fill cell.alignment=center wb.save('销售报表.xlsx')调整列宽
ws.column_dimensions['A'].width=15ws.column_dimensions['B'].width=20想自动适配内容宽度,就遍历每列找出最长内容,按长度算个宽度(最长内容 + 2 再乘 1.2)。
数字格式:金额加货币符号
forrowinrange(2,ws.max_row+1):ws.cell(row=row,column=2).number_format='¥#,##0.00'¥#,##0.00= 人民币符号 + 千分位 + 两位小数,数字一下就"财务报表"起来了。
透视表:一行代码生成汇总报表
做分析最常用的交叉汇总——按类别看每个月的销售情况,pivot_table专门干这个:
importpandasaspd data={'日期':['2026-01-05','2026-01-12','2026-01-20','2026-02-03','2026-02-15','2026-01-08','2026-01-22','2026-02-10','2026-02-25','2026-03-05'],'类别':['电子产品','服装','食品','电子产品','服装','食品','电子产品','服装','食品','电子产品'],'金额':[2999,299,89.5,3599,459,128.8,1899,369,156.2,4299]}df=pd.DataFrame(data)df['月份']=pd.to_datetime(df['日期']).dt.month.astype(str)+'月'pivot=pd.pivot_table(df,values='金额',# 用什么值汇总index='类别',# 行columns='月份',# 列aggfunc='sum',# 聚合方式fill_value=0# 空值填0)print(pivot)然后导出:pivot.to_excel('销售透视表.xlsx'),就是一份专业的交叉报表。
aggfunc还能用'mean''count''max';想同时看多个指标,传列表aggfunc=['sum','mean','count']。
按类别分别生成文件
给每个类别各出一份报表,用循环:
importos df=pd.DataFrame({'类别':['电子产品','服装','食品','电子产品','服装','食品'],'商品':['手机','T恤','零食','平板','裤子','饮料'],'金额':[2999,129,39.9,1999,259,5.5]})os.makedirs('分类报表',exist_ok=True)forcategory,groupindf.groupby('类别'):filename=f'分类报表/{category}销售明细.xlsx'group.to_excel(filename,index=False)有多少个类别就生成多少个文件,全自动。想加格式美化?把 openpyxl 代码塞循环里就行。
真实运行效果
把上面的透视表、多 Sheet 导出和批量导出代码实际跑一遍,终端输出长这样:
截图依次展示了 pivot_table 按类别交叉汇总的结果、一个 Excel 里三个 Sheet 的回读确认,以及按类别批量生成的三个明细文件。
格式怎么选?一张表说清楚
| 格式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| CSV | 兼容性最好、文件小 | 无格式、单表 | 数据交换、给程序读 |
| Excel | 多Sheet、带格式 | 文件稍大、需Excel | 给人看、做报告 |
| JSON | 结构化、程序易读 | 人看不懂 | API交互、前后端传输 |
| Pickle | 保留Pandas类型 | 二进制、人读不了 | Python内部快速存取 |
简单记:给人看 → Excel;给程序读 → CSV 或 JSON;自己临时存中间结果 → Pickle。
这10篇下来,你能搞定什么
Python数据实战系列前10篇串一遍:
数据采集部分(5篇):requests入门、BeautifulSoup提取、表格抓取、CSV保存、爬虫工程化。
Pandas分析部分(5篇):读取CSV、数据清洗、分组统计、筛选归类、结果导出。
10篇学完,完整的数据分析流程你已经跑通:读取数据 → 清洗处理 → 分组分析 → 筛选挖掘 → 导出报表。从拿到一份原始数据,到产出一份能交差的报表,这条路自己走通了。接下来还会更新数据可视化——折线图看趋势、柱状图比高低、饼图看占比,把数字变成图表,说服力翻倍。
几个常见的坑
1. 导出的Excel是空的?大概率忘了保存。优先用with语句;手动创建的 ExcelWriter 记得writer.save()和writer.close()。
2. 中文文件名乱码?老版本环境偶发,尽量用英文文件名,或确保 Python 是 UTF-8 环境。
3. 报 PermissionError 文件被占用?十有八九是你把 Excel 开着,先关掉再跑代码。
4. 数字导出来是文本格式(左上角小三角)?df.dtypes看是不是 object 类型,先转数值:
df['金额']=pd.to_numeric(df['金额'],errors='coerce')梅雅达编程工作室 · Python数据实战系列第10篇
分析做得再好,最后能交出去的那份报表,才算真的落地。到这儿,从采集到分析这条路你已经自己走通了一遍。