首页 > 其他分享 >借助Rich库实现Pandas DataFrame颜值升级

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

时间:2024-02-13 19:11:18浏览次数:39  
标签:__ min df 颜值 DataFrame self Rich col

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

不过,使用DataFrame开发我们的分析程序的时候,经常需要打印出DataFrame的内容,
以验证和调试数据的处理是否正确。

在命令行中虽然可以直接打印出DataFrame的内容,但是阅读比较困难。
正好前段时间了解到python的一个用于创建美观和富有表现力的终端输出的库--Rich

Rich库有命令行中显示表格的功能,于是,尝试了结合Rich来显示DataFrame
以便在开发过程中,更好的调试DataFrame中的数据。

1. 原始显示

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

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)

image.png

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

2. 表格显示

接下来,该Rich登场了。
为了方便后续逐步扩展功能,我创建了一个DataFramePretty类来显示DataFrame

# -*- 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类来显示。

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文件中。

显示效果如下:
image.png

3. 标题和表头

上面是最朴素的显示方式,但是至少通过表格和边框,将每列的数据很清晰的分割开来,方便阅读。
在创建表格时,可以简单的添加一些参数,给表格添加个标题,这样在需要显示多个表格的时候,方便区分。
还可以给表头设置个样式(比如颜色),以区分表头和值。

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

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

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

4. 高亮最大最小值

找出最大值和最小值是常见的分析步骤,下面扩展了DataFramePretty类,增加一个min_max_cols属性,
用来标记需要高亮最大最小值的列。

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类调整后,调用的地方也相应修改如下:

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

显示效果如下:
image.png

5. 加入Emoji

最后这个Emoji的功能是在看Rich文档的时候偶然看到的,没想到还能支持Emoji
试了下,给最大值后面加个大拇指向上,最小值后面加个大拇指向下。

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

修改为:

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

效果如下:
image.png

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小技巧

标签:__,min,df,颜值,DataFrame,self,Rich,col
From: https://www.cnblogs.com/wang_yb/p/18014731

相关文章

  • pandas.DataFrame.drop()函数
    在Pandas库中,DataFrame.drop()用于移除DataFrame中的行或列。df.drop(labels=None,axis=0,index=None,columns=None,level=None,inplace=False,errors='raise')参数:1.labels:要删除的列或者行,如果要删除多个,传入列表2.axis:轴的方向,0为行,1为列,默认为03.......
  • Python Rich:美化终端显示效果
    Rich库的功能就像它的名字一样,使Python编程更加丰富(rich),它帮助开发者在控制台(命令行)输出中创建丰富、多彩和具有格式化的文本。本篇总结了如何使用Rich库让我们的命令行工具更加美观。1.安装通过pip安装:pipinstallrich使用下面的命令验证是否安装成功。python-mrich......
  • [969] Add a spatial reference (a coordinate reference system, CRS) to a GeoDataF
    Toaddaspatialreference(acoordinatereferencesystem,CRS)toaGeoDataFrameinGeoPandas,youcansetthecrsattributeoftheGeoDataFrametothedesiredCRS.Here'showyoucandoit:importgeopandasasgpdfromshapely.geometryimportPoint......
  • [964] Convert a DataFrame to a GeoDataFrame
    ToconvertaDataFrametoaGeoDataFrameinPandas,youcanusethegeopandas.GeoDataFrameconstructorandprovidethegeometrycolumn.Here'sanexample:importpandasaspdimportgeopandasasgpdfromshapely.geometryimportPoint#SampleDataFr......
  • [965] Generate a new empty DataFrame with the same columns as an existing DataFr
    TogenerateanewemptyDataFramewiththesamecolumnsasanexistingDataFrameinPandas,youcanusethepd.DataFrameconstructorandpassthecolumnsfromtheexistingDataFrame.Here'sanexample:importpandasaspd#SampleDataFrameexisti......
  • RichTextBox控件
    RichTextBox控件用法基本用法基本用法不做赘述富文本用法RTF文档是纯文本文件,可以在不同的软件,和平台之间进行交换和共享,且可以保留文本样式、字体、颜色等格式信息,也可以添加表格。RichTextBox控件中支持RTF格式的文档,可以使流水日志具有各种各样的格式,从而方便查看绘......
  • Pandas库学习笔记(4)---Pandas DataFrame
    PandasDataFrame  PandasDataFrame基本操作DataFrame是二维数据结构,即,数据以表格形式在行和列中对齐。DataFrame的功能潜在的列是不同类型的大小可变标记的轴(行和列)可以对行和列执行算术运算结构体pandas.SeriesSeries结构如下: 让我们假设我们正在使用学生的数......
  • pandas - isin()函数 是一个pandas.Series和pandas.DataFrame的方法,用于检查每个元素
    matched_rows=df[~df['设备IMEI'].isin(b_df['设备IMEI'])]这段代码的作用是从DataFramedf中筛选出不在另一个DataFrameb_df的"设备IMEI"列中的值。df['设备IMEI']表示在DataFramedf中获取"设备IMEI"列的序列。b_df['设备IMEI']表示在DataFrameb_df......
  • pandas - reset_index() 函数 将Series对象转换为一个新的DataFrame
    #df=pd.read_excel(r"D:\PyCharm\年度数据处理\1月设备离线01.xlsx",sheet_name='Sheet2')#value_counts=df['解除时间'].value_counts().reset_index()#print(value_counts)这段代码的作用是对DataFrame中的"解除时间"列进行值计数,并将结果保存在一个新的DataFrame......
  • `pandas.ExcelFile.parse` 和 `pandas.read_excel` 都是 pandas 库中用于从 Excel 文
    `pandas.ExcelFile.parse`和`pandas.read_excel`都是pandas库中用于从Excel文件读取数据并创建DataFrame的方法¹。这两个方法的主要区别在于它们的使用场景和语法。-`pandas.read_excel`是一个函数,它可以直接读取Excel文件并返回一个DataFrame¹。这个函数非常适合......