翼度科技»论坛 编程开发 python 查看内容

Pandas导出美化技巧,让你的Excel更出众

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
pandas的DataFrame可以通过设置参数使得在jupyter notebook中显示的更加美观,
但是,将DataFrame的数据导出excel时,却只能以默认最朴素的方式将数据写入excel。
本文介绍一种简单易用,让导出的excel更加美观的方法。
1. 概要

首先,引入一个库StyleFrame,这个库封装 pandas和openpyxl,让我们轻松的设置DataFrame的样式并导出到excel中。
安装很简单:
  1. pip install styleframe
复制代码
这个库主要包含3个模块:

  • styleframe:相当于这个库的主入口,它封装了DataFrame对象。
  • styler:用来单元格的样式。
  • utils:常用样式元素的辅助类,比如数字和日期格式、颜色和边框类型等。
安装成功之后,下面通过示例看看如何使用。
2. 准备数据

下面示例中使用的数据采集自链家网的真实成交数据。
数据下载地址:https://databook.top/。
导入数据:
  1. import pandas as pd
  2. fp = "D:/data/南京二手房交易/南京建邺区.csv"
  3. df = pd.read_csv(fp)
  4. # 为了简化,只取10条数据来演示导出效果
  5. df = df.head(10)
复制代码

3. 行列设置

先看看默认导出excel的效果。
  1. output = "d:\data\output.xlsx"
  2. df.to_excel(output, index=None)
复制代码

默认导出的样式就是这样,所有单元格都一样,不管单元格的内容是什么。
3.1. 设置自适应

第一步,我们设置内容自适应(shrink_to_fit),确保每个单元格中的内容能够完整显示。
  1. from styleframe import StyleFrame, Styler, utils
  2. style = Styler(shrink_to_fit=True)
  3. sf = StyleFrame(df, styler_obj=style)
  4. writer = sf.to_excel(output)
  5. writer.close()
复制代码

可以看出,StyleFrame的默认导出样式,给有数据的表格加了边框。
使用shrink_to_fit=True样式之后,每个单元格的内容可以完整显示了。
3.2. 设置列宽

从上面的效果,我们发现,所有列的宽度是一样的,无论列中的内容有多长。
我们可以设置某些文字内容比较多列更宽一些。
  1. sf.set_column_width_dict(
  2.     {
  3.         "name": 25,
  4.         "positionInfo": 20,
  5.         "advantage": 15,
  6.         "dealCycleDays": 16,
  7.     }
  8. )
复制代码

调整之后,内容看起来更清晰了。
3.3. 设置表头,内容

接下来,我们通过字号对齐方式背景色以及是否加粗来区分表头内容部分。
  1. header_style = Styler(
  2.     bg_color="yellow",
  3.     bold=True,
  4.     font_size=12,
  5.     horizontal_alignment=utils.horizontal_alignments.center,
  6.     vertical_alignment=utils.vertical_alignments.center,
  7. )
  8. content_style = Styler(
  9.     shrink_to_fit=True,
  10.     font_size=8,
  11.     horizontal_alignment=utils.horizontal_alignments.left,
  12. )
  13. sf.apply_column_style(sf.columns, content_style)
  14. sf.apply_headers_style(header_style)
复制代码

内容更加紧凑了,表头部分也更突出了。
3.4. 设置行间隔颜色

最后,我们在优化下内容显示部分,用不同的背景色区分奇数行偶数行
  1. row_style = Styler(
  2.     bg_color="#32CD32",
  3.     shrink_to_fit=True,
  4.     font_size=8,
  5.     horizontal_alignment=utils.horizontal_alignments.left,
  6. )
  7. # 计算要设置背景色的行索引
  8. indexes = list(range(1, len(sf), 2))
  9. sf.apply_style_by_indexes(indexes, styler_obj=row_style)
复制代码

4. 样式设置

样式设置主要是Styler这个模块提供的功能。
通过Styler类提供的接口,我们可以设置灵活的控制导出的样式。
4.1. 字体

我们给第一行设置不同的字体(font="STKaiti"),看看导出的效果:
  1. first_line_style = Styler(
  2.     shrink_to_fit=True,
  3.     font="STKaiti",
  4.     font_size=14,
  5.     horizontal_alignment=utils.horizontal_alignments.left,
  6. )
  7. sf.apply_style_by_indexes(indexes_to_style=[0], styler_obj=first_line_style)
复制代码

第一行的字体是华文楷体,和其他行不一样。
4.2. 颜色

再把第一行的字调成蓝色(font_color="blue")。
  1. first_line_style = Styler(
  2.     shrink_to_fit=True,
  3.     font="STKaiti",
  4.     font_size=14,
  5.     font_color="blue",
  6.     horizontal_alignment=utils.horizontal_alignments.left,
  7. )
  8. sf.apply_style_by_indexes(indexes_to_style=[0], styler_obj=first_line_style)
复制代码

4.3. 背景色

再给第一行加一个红色背景(bg_color="red")。
  1. first_line_style = Styler(
  2.     shrink_to_fit=True,
  3.     font="STKaiti",
  4.     font_size=14,
  5.     font_color="blue",
  6.     bg_color="red",
  7.     horizontal_alignment=utils.horizontal_alignments.left,
  8. )
  9. sf.apply_style_by_indexes(indexes_to_style=[0], styler_obj=first_line_style)
复制代码

4.4. 边框

边框是区隔,突出内容的一种手段,比如,我们可以在表头部分用实线粗边框(border_type=utils.borders.thick),内容部分用虚线细边框(border_type=utils.borders.dashed)。
  1. header_style = Styler(
  2.     bg_color="yellow",
  3.     bold=True,
  4.     font_size=14,
  5.     border_type=utils.borders.thick,
  6. )
  7. content_style = Styler(
  8.     shrink_to_fit=True,
  9.     font_size=12,
  10.     border_type=utils.borders.dashed,
  11. )
  12. sf.apply_column_style(sf.columns, content_style)
  13. sf.apply_headers_style(header_style)
复制代码

4.5. 数字和日期

最后,看看如何定制数字(number_format)和日期(date_format)的显示方式。
我们把上面示例中的总价(totalPrice)保留两位小数,日期(DealDate)改为只显示月和日。
  1. num_style = Styler(
  2.     shrink_to_fit=True,
  3.     font_size=12,
  4.     number_format=utils.number_formats.general_float,
  5.     border_type=utils.borders.dashed,
  6.     horizontal_alignment=utils.horizontal_alignments.left,
  7. )
  8. sf.apply_column_style(["totalPrice", "unitPrice"], num_style)
  9. date_style = Styler(
  10.     shrink_to_fit=True,
  11.     font_size=12,
  12.     date_format="DD/MM",
  13.     border_type=utils.borders.dashed,
  14.     horizontal_alignment=utils.horizontal_alignments.left,
  15. )
  16. sf.apply_column_style("dealDate", date_style)
复制代码

5. 总结

导出分析结果是我们做数据分析的最后一步,也是最容易被忽视的一步。
我们常常把大部分的精力都会花在数据的整理和分析上,最后给客户提供一个简易的报告和数据。
殊不知,导出一个美观清晰的分析结果和数据,反而更能得到客户的肯定和信任,因为这才是客户能够切身感知到的部分,否则花在数据整理和分析的精力再多,也不能让客户有直接的感受。

来源:https://www.cnblogs.com/wang_yb/p/18070891
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x

举报 回复 使用道具