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)

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

显示效果如下:

3. 标题和表头

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

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

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属性,
用来标记需要高亮最大最小值的列。

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()

显示效果如下:

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

效果如下:

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

借助Rich库实现Pandas DataFrame颜值升级的更多相关文章

  1. 使用第三方库连接MySql数据库:PyMysql库和Pandas库

    使用PyMysql库和Pandas库链接Mysql 1 系统环境 系统版本:Win10 64位 Mysql版本: 8.0.15 MySQL Community Server - GPL pymysql ...

  2. pandas.DataFrame——pd数据框的简单认识、存csv文件

    接着前天的豆瓣书单信息爬取,这一篇文章看一下利用pandas完成对数据的存储. 回想一下我们当时在最后得到了六个列表:img_urls, titles, ratings, authors, detai ...

  3. pandas dataframe类型操作

    用python做数据分析pandas库介绍之DataFrame基本操作   怎样删除list中空字符? 最简单的方法:new_list = [ x for x in li if x != '' ] 这 ...

  4. pandas.DataFrame学习系列1——定义及属性

    定义: DataFrame是二维的.大小可变的.成分混合的.具有标签化坐标轴(行和列)的表数据结构.基于行和列标签进行计算.可以被看作是为序列对象(Series)提供的类似字典的一个容器,是panda ...

  5. pandas.DataFrame的pivot()和unstack()实现行转列

    示例: 有如下表需要进行行转列: 代码如下: # -*- coding:utf-8 -*- import pandas as pd import MySQLdb from warnings impor ...

  6. maven私库nexus2.3.0-04迁移升级到nexus-3.16.1-02(异机迁移备份)

    环境信息: nexus2.3.0-04安装在32位Windows server 2003系统上 安装位置信息如下: 仓库迁移 Nexus的构件仓库都保存在sonatype-work目录中,nexus2 ...

  7. pandas DataFrame apply()函数(1)

    之前已经写过pandas DataFrame applymap()函数 还有pandas数组(pandas Series)-(5)apply方法自定义函数 pandas DataFrame 的 app ...

  8. pandas DataFrame apply()函数(2)

    上一篇pandas DataFrame apply()函数(1)说了如何通过apply函数对DataFrame进行转换,得到一个新的DataFrame. 这篇介绍DataFrame apply()函数 ...

  9. 把pandas dataframe转为list方法

    把pandas dataframe转为list方法 先用numpy的 array() 转为ndarray类型,再用tolist()函数转为list

  10. pandas DataFrame.shift()函数

    pandas DataFrame.shift()函数可以把数据移动指定的位数 period参数指定移动的步幅,可以为正为负.axis指定移动的轴,1为行,0为列. eg: 有这样一个DataFrame ...

随机推荐

  1. Blazor模式讲解

    Blazor的三种模式 Blazor Server: Blazor Server在 ASP.NET Core 应用中支持在服务器上托管 Razor 组件. 可通过 SignalR 连接处理 UI 更新 ...

  2. 【MicroPython】生成QSTR表 - py\makeqstrdata.py

    转义非字母数字的字符,转义结果为预定义字符串codepoint2name[] def qstr_escape(qst): def esc_char(m): c = ord(m.group(0)) tr ...

  3. 战略设计- DDD

    随着系统的增长,它会变得越来越复杂,当我们无法通过分析对象来理解系统的时候,就需要掌握一些操纵和理解大模型的技术了.本文将介绍一些原则.遵循这些原则,就可以对非常复杂的领域进行建模.大部分这样的决策都 ...

  4. [转帖]深入理解mysql-第十二章 mysql查询优化-Explain 详解(下)

    我们前面两章详解了Explain的各个属性,我们看到的都是mysql已经生成的执行计划,那这个执行计划的是如何生成的?我们能看到一些过程指标数据吗?实际mysql贴心为我们提供了执行计划的各项成本评估 ...

  5. 【转帖】奇淫技巧 | route命令设置网络优先级

    奇淫技巧 | route命令设置网络优先级 https://blog.csdn.net/DynmicResource/article/details/120134745 1. 背景 在生活中的会经常遇 ...

  6. [转帖]gcc与makefile常用操作(绝对常用,也绝对够用)

    makefile与gcc常用操作 一.温故知新 1.可执行程序的生成过程 2.gcc的常用操作 二.make操作 三.编写Makefile文件时常用操作 注意:在Makefile文件中 空格和缩进是完 ...

  7. Raid卡在Write back 与Write through 时的性能差异

    还是读姜老师的 mysql技术内核innodb存储引擎这本书里面的内容. 之前知道raid卡的设置会影响性能, 预计也是十几倍的性能差距, 但是从来没有用数据库进行过验证 书中有针对不通raid卡的设 ...

  8. 【图论,网络流】CF1525F Goblins And Gnomes

    Problem Link 你在打怪.你有一个 \(n\) 个点 \(m\) 条边的 DAG,接下来会有 \(k\) 波怪来袭,第 \(i\) 波怪有 \(i\) 个,它们会各自选择走一条路径,要求它们 ...

  9. React数据通信父传子和子传父的使用

    组件中的props 在react中,props的特点是: 1.可以给组件传递任意类型的数据 2.props是只读的对象,只能够读取属性的值,无法修改对象 如过我们强行修改数据,会报错,告诉我们该属性是 ...

  10. .net fromwork连接rabbitmq发布消息

    1.创建连接工厂类 var factory = new RabbitMQ.Client.ConnectionFactory() { HostName = "120.237.72.46&quo ...