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

借助Rich库实现Pandas DataFrame颜值升级

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
pandas的DataFrame功能强大自不必说,它可以帮助我们极大的提高统计分析的效率。
不过,使用DataFrame开发我们的分析程序的时候,经常需要打印出DataFrame的内容,
以验证和调试数据的处理是否正确。
在命令行中虽然可以直接打印出DataFrame的内容,但是阅读比较困难。
正好前段时间了解到python的一个用于创建美观和富有表现力的终端输出的库--Rich。
Rich库有命令行中显示表格的功能,于是,尝试了结合Rich来显示DataFrame,
以便在开发过程中,更好的调试DataFrame中的数据。
1. 原始显示

首先,构造一个简单的DataFrame,直接在命令行中显示出来,看看原始的效果,然后再一步步改进。
  1. import pandas as pd
  2. if __name__ == "__main__":
  3.     df = pd.DataFrame(
  4.         {
  5.             "订单号": ["0001", "0002", "0003", "0004", "0005"],
  6.             "单价": [1099.5, 8790.0, 12.55, 10999.0, 999.5],
  7.             "数量": [1, 3, 1200, 4, 5],
  8.         }
  9.     )
  10.     df["总价"] = df["单价"] * df["数量"]
  11.     print(df)
复制代码

从图中可以看出,默认情况下,表头和值都没有对齐,
这个示例的DataFrame比较简单,如果列多的话,阅读会更加困难。
2. 表格显示

接下来,该Rich登场了。
为了方便后续逐步扩展功能,我创建了一个DataFramePretty类来显示DataFrame。
  1. # -*- coding: utf-8 -*-
  2. import pandas as pd
  3. from rich.console import Console
  4. from rich.table import Table
  5. class DataFramePretty(object):
  6.     def __init__(self, df: pd.DataFrame) -> None:
  7.         self.data = df
  8.     def show(self):
  9.         table = Table()
  10.         # self.data是原始数据
  11.         # df 是用来显示的数据
  12.         df = self.data.copy()
  13.         for col in df.columns:
  14.             df[col] = df[col].astype("str")
  15.             table.add_column(col)
  16.         for idx in range(len(df)):
  17.             table.add_row(*df.iloc[idx].tolist())
  18.         console = Console()
  19.         console.print(table)
复制代码
主函数也稍微做些调整,不是直接print(df),而是用DataFramePretty类来显示。
  1. import pandas as pd
  2. from dataframe_pretty import DataFramePretty
  3. if __name__ == "__main__":
  4.     df = pd.DataFrame(
  5.         {
  6.             "订单号": ["0001", "0002", "0003", "0004", "0005"],
  7.             "单价": [1099.5, 8790.0, 12.55, 10999.0, 999.5],
  8.             "数量": [1, 3, 1200, 4, 5],
  9.         }
  10.     )
  11.     df["总价"] = df["单价"] * df["数量"]
  12.     dfp = DataFramePretty(df)
  13.     dfp.show()
复制代码
DataFramePretty类在同级目录的dataframe_pretty.py文件中。
显示效果如下:

3. 标题和表头

上面是最朴素的显示方式,但是至少通过表格和边框,将每列的数据很清晰的分割开来,方便阅读。
在创建表格时,可以简单的添加一些参数,给表格添加个标题,这样在需要显示多个表格的时候,方便区分。
还可以给表头设置个样式(比如颜色),以区分表头和值。
修改方法很简单,把上面DataFramePretty类中的table = Table()改成:
  1. table = Table(
  2.     title="DataFrame",
  3.     title_,
  4.     header_,
  5. )
复制代码
显示效果如下:

这里的标题(title)固定用了DataFrame字符串,实际使用时,可以根据情况使用和自己表格内容相关的标题。
title_style参数是设置标题样式的,header_style参数是 设置表头样式的。
4. 高亮最大最小值

找出最大值和最小值是常见的分析步骤,下面扩展了DataFramePretty类,增加一个min_max_cols属性,
用来标记需要高亮最大最小值的列。
  1. class DataFramePretty(object):
  2.     def __init__(self, df: pd.DataFrame, min_max_cols=[]) -> None:
  3.         self.data = df
  4.         self.min_max_cols = min_max_cols
  5.     def __set_min_max_style(self, df: pd.DataFrame):
  6.         imax = self.data.idxmax()
  7.         imin = self.data.idxmin()
  8.         max_tmpl = "[b on red3]{}[/b on red3]"
  9.         min_tmpl = "[i on green3]{}[/i on green3]"
  10.         for col in self.min_max_cols:
  11.             col_idx = imax.index.tolist().index(col)
  12.             val = df.iloc[imax[col], col_idx]
  13.             df.iloc[imax[col], col_idx] = max_tmpl.format(val)
  14.             col_idx = imin.index.tolist().index(col)
  15.             val = df.iloc[imin[col], col_idx]
  16.             df.iloc[imin[col], col_idx] = min_tmpl.format(val)
  17.     def show(self):
  18.         table = Table(
  19.             title="DataFrame",
  20.             title_,
  21.             header_,
  22.         )
  23.         # self.data是原始数据
  24.         # df 是用来显示的数据
  25.         df = self.data.copy()
  26.         for col in df.columns:
  27.             df[col] = df[col].astype("str")
  28.             table.add_column(col)
  29.         self.__set_min_max_style(df)
  30.         for idx in range(len(df)):
  31.             table.add_row(*df.iloc[idx].tolist())
  32.         console = Console()
  33.         console.print(table)
复制代码
说明:

  • __init__函数中增加了一个min_max_cols参数,用来传入需要高亮最大最小值的列,默认为空列表
  • __set_min_max_style函数用来高亮每个列的最大最小值,最大值用粗体红色,最小值用斜体绿色
其中的变量max_tmpl和min_tmpl就是用来定义最大最小值样式的。
DataFramePretty类调整后,调用的地方也相应修改如下:
  1.     dfp = DataFramePretty(df, ["单价", "数量", "总价"])
  2.     dfp.show()
复制代码
显示效果如下:

5. 加入Emoji

最后这个Emoji的功能是在看Rich文档的时候偶然看到的,没想到还能支持Emoji。
试了下,给最大值后面加个大拇指向上,最小值后面加个大拇指向下。
  1. max_tmpl = "[b on red3]{}[/b on red3]"
  2. min_tmpl = "[i on green3]{}[/i on green3]"
复制代码
修改为:
  1. max_tmpl = "[b on red3]{}[/b on red3] :thumbsup:"
  2. min_tmpl = "[i on green3]{}[/i on green3] :thumbsdown:"
复制代码
效果如下:

6. 附录

这个简单封装的DataFramePretty类,不太成熟,暂时是为了方便自己在开发过程中打印DataFrame用的。
上面的DataFramePretty类只高亮了最大值和最小值,其他根据实际业务需要高亮的内容可以仿照编写。
Emoji的功能不只是为了好玩,也给我们多提供了一种标记数据的方式。
Rich库的颜色种类可参考:https://github.com/scotch-io/All-Github-Emoji-Icons
Emoji的字符表示可参考:https://github.com/scotch-io/All-Github-Emoji-Icons
关于Rich的介绍可参考之前的文章:Python Rich:美化终端显示效果
关于pandas的介绍可参考之前的系列:pandas基础 pandas小技巧

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

本帖子中包含更多资源

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

x

举报 回复 使用道具