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

这篇具有很好参考价值的文章主要介绍了借助Rich库实现Pandas DataFrame颜值升级。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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)

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

从图中可以看出,默认情况下,表头和值都没有对齐,
这个示例的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文件中。

显示效果如下:
借助Rich库实现Pandas DataFrame颜值升级

3. 标题和表头

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

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

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

显示效果如下:
借助Rich库实现Pandas DataFrame颜值升级
这里的标题(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()

显示效果如下:
借助Rich库实现Pandas DataFrame颜值升级

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:"

效果如下:
借助Rich库实现Pandas DataFrame颜值升级

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.toymoban.com/news/detail-825113.html

到了这里,关于借助Rich库实现Pandas DataFrame颜值升级的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据分析 - 基础入门之pandas篇③】- pandas数据结构——DataFrame

    大家好!我是一朵向阳花(花花花)🍭,本期跟大家分享的知识是 pandas 数据结构——DataFrame。 作者的【 Python 数据分析】专栏正在火热更新中🔥,如果本文对您有帮助,欢迎大家点赞 + 评论 + 收藏 ! 每日金句分享: 慢慢来,谁还没有一个努力的过程。』—— pony「网易云

    2024年02月16日
    浏览(41)
  • 【Pandas学习】多条件筛选DataFrame

    目录 一、按列筛选 1、简单筛选 2、多条件筛选  二、按行筛选 三、多条件组合 DataFrameSeries  执行 、 、 == 这些运算符时,会将每一个元素进行比较,得到一个由结果( Boolean 值)组成的相同大小的 DataFrameSeries 返回。 相同大小的 DataFrameSeries 之间可以用 、 | 、 ~ 运算符进

    2024年02月16日
    浏览(31)
  • Pandas DataFrame如何添加一行数据?

    在Pandas DataFrame中,我们经常需要添加新的行数据。这里介绍几种向DataFrame中添加一行数据的方法。 1. 使用.loc索引器 .loc索引器可以在DataFrame的尾部添加一条新行数据,语法如下: 例如: 2. 使用.append()方法 .append()方法可以向DataFrame尾部追加一行数据,语法如下: 例如: 3. 使用insert方

    2024年02月12日
    浏览(41)
  • pandas中DataFrame数据合并、连接

    为解决数据冗余等问题,大量的数据会分开存放在不同的文件(表格)里。在数据处理时,经常会有不同表格的数据需要进行合并操作。可以通过pandas库的 merge函数 和 concat函数 来实现数据集的合并。 根据 一个或多个键 将不同DataFrame中的 行 连接起来。 说明:类似于关系数

    2024年02月15日
    浏览(42)
  • pandas--DataFrame--数据切片/筛选/取值

    2024年02月13日
    浏览(52)
  • pandas dataframe df.join

    根据dataframe的index索引进行拼接,即df1.index=df2.index时,才会将df2[‘发布时间’]拼到df1左边 如果想指定共同索引,可以用df.merge 此外如果想忽略索引直接1对1拼接,可以先df.reset_index再用df.join

    2024年02月03日
    浏览(38)
  • Pandas中对DataFrame列名进行重命名

    目录 1.重命名Pandas DataFrame Column(列) 2.在创建Dataframe时指定列名 3.※使用 list 设置全部列名※ Pandas是一个用于数据分析和操作的Python库。在 pandas 中几乎所有的操作都围绕着 DataFrame 。 Dataframe 是一个二维表的抽象表示,可以包含各种数据。 背景:只想重命名几列,最好在创

    2023年04月18日
    浏览(34)
  • 借助Numpy,优化Pandas的条件检索代码

    Numpy 其实是最早的处理数据的 Python 库,它的核心 ndarray 对象,是一个高效的n维数组结构。 通过这个库,可以高效的完成向量和矩阵运算,由于其出色的性能,很多其他的数据分析,科学计算或者机器学习相关的 Python 库都或多或少的依赖于它。 Pandas 就是其中之一, Pandas

    2024年03月21日
    浏览(42)
  • pandas dataframe获取列名、添加列名、列索引

    四种获取列名的方式: 如果一个矩阵,将其变为dataframe格式,没有列名,打印行数、列数以及选取某一列,选取某一列时,直接df[index],注意想获取第三列,index应该等于2,列索引从0开始。 想给他们添加列名,使用方法如下: 如果一个dataframe已经有列名字,可以进行覆盖。

    2024年02月15日
    浏览(46)
  • pandas中如何提取DataFrame的某些列

    在处理表格型数据时,一行数据是一个 sample,列就是待提取的特征。怎么选取其中的一些列呢?本文分享一些方法。 使用如下的数据作为例子: Name course1 course2 course3 fruit sport 1 Anna 85 90 82 apple basketball 2 Betty 83 85 86 banana volleyball 3 Richard 90 83 81 apple football 4 Philip 84 88 91 orange

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包