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

pandasDataFrame功能强大自不必说,它可以帮助我们极大的提高统计分析的效率。

不过,使用DataFrame开发我们的分析程序的时候,经常需要打印出DataFrame的内容,

以验证和调试数据的处理是否正确。

在命令行中虽然可以直接打印出DataFrame的内容,但是阅读比较困难。

正好前段时间了解到python的一个用于创建美观和富有表现力的终端输出的库--Rich

Rich库有命令行中显示表格的功能,于是,尝试了结合Rich来显示DataFrame

以便在开发过程中,更好的调试DataFrame中的数据。

1. 原始显示

首先,构造一个简单的DataFrame,直接在命令行中显示出来,看看原始的效果,然后再一步步改进。

python 复制代码
import pandas as pd

if __name__ == "__main__":
    df = pd.DataFrame(
        {
            "订单号": ["0001", "0002", "0003", "0004", "0005"],
            "单价": [1099.5, 8790.0, 12.55, 10999.0, 999.5],
            "数量": [1, 3, 1200, 4, 5],
        }
    )

    df["总价"] = df["单价"] * df["数量"]
    print(df)

从图中可以看出,默认情况下,表头和值都没有对齐,

这个示例的DataFrame比较简单,如果列多的话,阅读会更加困难。

2. 表格显示

接下来,该Rich登场了。

为了方便后续逐步扩展功能,我创建了一个DataFramePretty类来显示DataFrame

python 复制代码
# -*- coding: utf-8 -*-

import pandas as pd
from rich.console import Console
from rich.table import Table


class DataFramePretty(object):
    def __init__(self, df: pd.DataFrame) -> None:
        self.data = df

    def show(self):
        table = Table()

        # self.data是原始数据
        # df 是用来显示的数据
        df = self.data.copy()
        for col in df.columns:
            df[col] = df[col].astype("str")
            table.add_column(col)

        for idx in range(len(df)):
            table.add_row(*df.iloc[idx].tolist())

        console = Console()
        console.print(table)

主函数也稍微做些调整,不是直接print(df),而是用DataFramePretty类来显示。

python 复制代码
import pandas as pd
from dataframe_pretty import DataFramePretty

if __name__ == "__main__":
    df = pd.DataFrame(
        {
            "订单号": ["0001", "0002", "0003", "0004", "0005"],
            "单价": [1099.5, 8790.0, 12.55, 10999.0, 999.5],
            "数量": [1, 3, 1200, 4, 5],
        }
    )

    df["总价"] = df["单价"] * df["数量"]
    dfp = DataFramePretty(df)
    dfp.show()

DataFramePretty类在同级目录的dataframe_pretty.py文件中。

显示效果如下:

3. 标题和表头

上面是最朴素的显示方式,但是至少通过表格和边框,将每列的数据很清晰的分割开来,方便阅读。

在创建表格时,可以简单的添加一些参数,给表格添加个标题,这样在需要显示多个表格的时候,方便区分。

还可以给表头设置个样式(比如颜色),以区分表头和值。

修改方法很简单,把上面DataFramePretty类中的table = Table()改成:

python 复制代码
table = Table(
    title="DataFrame",
    title_style="i on dark_cyan",
    header_style="bold cyan",
)

显示效果如下:

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

4. 高亮最大最小值

找出最大值和最小值是常见的分析步骤,下面扩展了DataFramePretty类,增加一个min_max_cols属性,

用来标记需要高亮最大最小值的列。

python 复制代码
class DataFramePretty(object):
    def __init__(self, df: pd.DataFrame, min_max_cols=[]) -> None:
        self.data = df
        self.min_max_cols = min_max_cols

    def __set_min_max_style(self, df: pd.DataFrame):
        imax = self.data.idxmax()
        imin = self.data.idxmin()

        max_tmpl = "[b on red3]{}[/b on red3]"
        min_tmpl = "[i on green3]{}[/i on green3]"

        for col in self.min_max_cols:
            col_idx = imax.index.tolist().index(col)
            val = df.iloc[imax[col], col_idx]
            df.iloc[imax[col], col_idx] = max_tmpl.format(val)

            col_idx = imin.index.tolist().index(col)
            val = df.iloc[imin[col], col_idx]
            df.iloc[imin[col], col_idx] = min_tmpl.format(val)

    def show(self):
        table = Table(
            title="DataFrame",
            title_style="i on dark_cyan",
            header_style="bold cyan",
        )

        # self.data是原始数据
        # df 是用来显示的数据
        df = self.data.copy()
        for col in df.columns:
            df[col] = df[col].astype("str")
            table.add_column(col)

        self.__set_min_max_style(df)

        for idx in range(len(df)):
            table.add_row(*df.iloc[idx].tolist())

        console = Console()
        console.print(table)

说明:

  • __init__函数中增加了一个min_max_cols参数,用来传入需要高亮最大最小值的列,默认为空列表
  • __set_min_max_style函数用来高亮每个列的最大最小值,最大值用粗体红色 ,最小值用斜体绿色

其中的变量max_tmplmin_tmpl就是用来定义最大最小值样式的。

DataFramePretty类调整后,调用的地方也相应修改如下:

python 复制代码
    dfp = DataFramePretty(df, ["单价", "数量", "总价"])
    dfp.show()

显示效果如下:

5. 加入Emoji

最后这个Emoji的功能是在看Rich文档的时候偶然看到的,没想到还能支持Emoji

试了下,给最大值 后面加个大拇指向上,最小值后面加个大拇指向下。

python 复制代码
max_tmpl = "[b on red3]{}[/b on red3]"
min_tmpl = "[i on green3]{}[/i on green3]"

修改为:

python 复制代码
max_tmpl = "[b on red3]{}[/b on red3] :thumbsup:"
min_tmpl = "[i on green3]{}[/i on green3] :thumbsdown:"

效果如下:

6. 附录

这个简单封装的DataFramePretty类,不太成熟,暂时是为了方便自己在开发过程中打印DataFrame用的。

上面的DataFramePretty类只高亮了最大值和最小值,其他根据实际业务需要高亮的内容可以仿照编写。
Emoji的功能不只是为了好玩,也给我们多提供了一种标记数据的方式。

Rich库的颜色种类可参考:github.com/scotch-io/A...
Emoji的字符表示可参考:github.com/scotch-io/A...

关于Rich的介绍可参考之前的文章:Python Rich:美化终端显示效果

关于pandas的介绍可参考之前的系列:pandas系列

相关推荐
郭庆汝2 小时前
pytorch、torchvision与python版本对应关系
人工智能·pytorch·python
思则变5 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络5 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find7 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取8 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector9 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习10 小时前
Python入门Day2
开发语言·python
Vertira10 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉10 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗10 小时前
黑马python(二十四)
开发语言·python