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. java进阶(37)--多线程

    文档目录: 一.进程与线程 二.多线程的实现 三.获取线程名与线程对象 四.线程sleep方法 五.线程调度与优先级 六.线程安全(重点) 七.死锁 ------------------------- ...

  2. 【开源分享】基于Html开发的房贷计算器,模仿新浪财经

    房贷计算器是一种房贷计算的在线计算Web应用,按用户选择的贷款类型.贷款金额.期限.利率可计算得出每月月供参考.支付利息.还款总额这些信息.本文模仿新浪财经开发的房贷计算器. 作品预览 https:/ ...

  3. [转帖]Linux中的inode到底是什么

    https://www.jianshu.com/p/6aa4d7ef17de inode 是什么? 要了解 Linux 操作系统上的 inode 前,我们先来说说 Linux操作系统上的文件.对于 L ...

  4. [转帖]【压测】通过Jemeter进行压力测试(超详细)

    文章目录 背景 一.前言 二.关于JMeter 三.准备工作 四.创建测试 4.1.创建线程组 4.2.配置元件 4.3.构造HTTP请求 4.4.添加HTTP请求头 4.5.添加断言 4.6.添加察 ...

  5. [转帖]Guanaco, Llama, Vicuña, Alpaca该怎么区别

    https://zhuanlan.zhihu.com/p/106262896 在智利和秘鲁高原区经常会遇到的一种动物让人十分挠头,学术点称呼就是骆驼科其中一个族群--羊驼属和骆马属.头疼在于,分不清楚 ...

  6. [转帖]Skywalking介绍

    https://www.jianshu.com/p/ffa7ddcda4ab 微服务架构已经是一个很通用的系统架构,常见的技术栈如下图所示,这张架构图基本涵括了当前微服务体系下的各种技术栈,可能不同的 ...

  7. ContextSwitch 学习与使用

    ContextSwitch 学习与使用 说明 github上面有一个简单的测试系统调用以及上下文切换的工具. contextswitch. 下载之后直接make就可以进行简单的测试 需要注意的是 部分 ...

  8. [转帖]Unixbench的使用(综合性能测试、2D测试)和问题解决(跑不出多线程分数,调不出窗口,报错等)

    一.Unixbench简介 Unixbench一个基于系统的基准测试工具,不单纯是CPU 内存 或者磁盘测试工具.测试结果不仅仅取决于硬件,也取决于系统.开发库.甚至是编译器.Unixbench是一个 ...

  9. [转帖]【JVM】GC算法与垃圾收集器

    引入 java 语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理.由于有个垃圾回收机制,可以有效的防止 ...

  10. [转帖]shell脚本变量详解(自定义变量、环境变量、变量赋值、变量运算、变量内容替换)

    https://developer.aliyun.com/article/885658 简介: shell变量 shell变量是指用一个特定的字符串去表示不固定的内容 1.变量的类型 1.1自定义变量 ...