Pandas Style 为数据表格美颜-程序员宅基地

技术标签: css  抽象类  html  列表  less  

作者:牵引小哥

来源:牵引小哥讲Python

1. 创建样式

传递样式函数的方法:

  • Styler.applymap: 逐个元素,返回带有CSS属性-值对的单个字符串。

  • Styler.apply: 列/行/表方式,返回形状相同的Series或DataFrame,其中每个值都是带有CSS属性值对的字符串。

Styler.applymap 作用于DataFrame中的每一个元素。Styler.apply 通过axis参数,每一次将一列或一行或整个表传递到DataFrame中。对于按列使用 axis=0, 按行使用 axis=1, 整个表使用 axis=None.

import pandas as pd
import numpy as np

np.random.seed(24)
df = pd.DataFrame({'A': np.linspace(1, 10, 10)})
df = pd.concat([df, pd.DataFrame(np.random.randn(10, 4), columns=list('BCDE'))],
               axis=1)
df.iloc[3, 3] = np.nan
df.iloc[0, 2] = np.nan
# 默认无样式
df.style

「注意」: DataFrame.style 返回Styler对象的属性。

# 通过调用.render方法来查看它们
df.style.highlight_null().render().split('\n')[:10]
['<style  type="text/css" >',
 '    #T_98ef3b58_b54d_11ea_87c2_8056f2b2fdccrow0_col2 {',
 '            background-color:  red;',
 '        }    #T_98ef3b58_b54d_11ea_87c2_8056f2b2fdccrow3_col3 {',
 '            background-color:  red;',
 '        }</style><table id="T_98ef3b58_b54d_11ea_87c2_8056f2b2fdcc" ><thead>    <tr>        <th class="blank level0" ></th>        <th class="col_heading level0 col0" >A</th>        <th class="col_heading level0 col1" >B</th>        <th class="col_heading level0 col2" >C</th>        <th class="col_heading level0 col3" >D</th>        <th class="col_heading level0 col4" >E</th>    </tr></thead><tbody>',
 '                <tr>',
 '                        <th id="T_98ef3b58_b54d_11ea_87c2_8056f2b2fdcclevel0_row0" class="row_heading level0 row0" >0</th>',
 '                        <td id="T_98ef3b58_b54d_11ea_87c2_8056f2b2fdccrow0_col0" class="data row0 col0" >1.000000</td>',
 '                        <td id="T_98ef3b58_b54d_11ea_87c2_8056f2b2fdccrow0_col1" class="data row0 col1" >1.329212</td>']

编写一个简单的样式函数,该函数会将负数涂成红色,将正数涂成黑色。

def color_negative_red(val):
    """
    Takes a scalar and returns a string with
    the css property `'color: red'` for negative
    strings, black otherwise.
    """
    color = 'red' if val < 0 else 'black'
    return 'color: %s' % color

在这种情况下,单元格的样式仅取决于其自身的值。我们应该使用在 Styler.applymap作用于每个元素。

df.style.applymap(color_negative_red)

定义一个突出显示每列中的最大值的函数。

def highlight_max(s):
    '''
    highlight the maximum in a Series yellow.
    '''
    is_max = s == s.max()
    return ['background-color: yellow' if v else '' for v in is_max]
df.style.apply(highlight_max)
实际上,已有定义好的各类高亮函数:

配合axis参数使用

  • highlight_max():高亮最大值

  • highlight_min():高亮最小值

  • highlight_null():高亮空值

# 高亮行最大值
df.style.highlight_max(axis=1)

使用链式操作进行定义样式

df.style.applymap(color_negative_red).apply(highlight_max)

2. 切片

subset 参数控制作用的行列。

subset 传入的参数类似DataFrame的切片:

  • 列标签

  • 列表(或者numpy数组)

  • 元组(row_indexer, column_indexer)

df.style.apply(highlight_max, subset=['B', 'C', 'D'])
使用pd.IndexSlice构造一个切片元组。
# B, D两列,2:5行中的负数标红 
df.style.applymap(color_negative_red,
                  subset=pd.IndexSlice[2:5, ['B', 'D']])

「注意」:目前仅支持基于标签的切片,不支持位置切片。

3.值的显示格式

使用Styler.format控制。类似字符串输出方法。

df.style.format("{:.2%}")
使用字典来格式化特定的列。
df.style.format({'B': "{:0<4.0f}", 'D': '{:+.2f}'})
使用lambda函数。
df.style.format({"B": lambda x: "±{:.2f}".format(abs(x))})
使用 na_rep设置空值的显示。
df.style.format("{:.2%}", na_rep="空值")
df.style.highlight_max().format(None, na_rep="-")

4. 内置样式函数

参考链接:https://pandas.pydata.org/docs/reference/style.html

# 高亮空值
df.style.highlight_null(null_color='red')
使用background_gradient 创建“热力图”式背景。需要配合matplotlib或者Seaborn使用。
import seaborn as sns
cm = sns.light_palette("green", as_cmap=True)

df.style.background_gradient(cmap=cm)
# Uses the full color range
df.loc[:4].style.background_gradient(cmap='viridis')
使用关键字参数lowhigh限定色谱百分比范围。
# Compress the color range
(df.loc[:4]
    .style
    .background_gradient(cmap='viridis', low=.5, high=0)
    .highlight_null('red'))
当样式不取决于值时,使用set_properties
df.style.set_properties(**{'background-color': 'black',
                           'color': 'lawngreen',
                           'border-color': 'white'})

5. 数据中包含“条形图”

df.style.bar(subset=['A', 'B'], color='#d65f5f')
使用align 控制对其方式:
  • left: 最小值从单元格的左侧开始。

  • zero: 零值位于单元格的中心。

  • mid: t单元格的中心在(max-min)/ 2,或者如果值全为负(正),则零对齐于单元格的右(左)。

df.style.bar(subset=['A', 'B'], align='mid', color=['#d65f5f', '#5fba7d'])

6. 共享样式

假设为DataFrame建立了一个样式,想将相同样式应用于第二个DataFrame。使用df1.style.export导出样式。

df2 = -df
style1 = df.style.applymap(color_negative_red)
style1
style2 = df2.style
style2.use(style1.export())
style2

7. 其他样式

精度set_precision

df.style.applymap(color_negative_red).apply(highlight_max).set_precision(2)

标题set_caption

df.style.set_caption('Colormaps, with a caption.')\
    .background_gradient(cmap=cm)

表格整体样式set_table_styles

from IPython.display import HTML

def hover(hover_color="#ffff99"):
    return dict(selector="tr:hover",
                props=[("background-color", "%s" % hover_color)])

styles = [
    hover(),
    dict(selector="th", props=[("font-size", "150%"),
                               ("text-align", "center")]),
    dict(selector="caption", props=[("caption-side", "top")])
]
html = (df.style.set_table_styles(styles)
          .set_caption("Hover to highlight."))
html

缺失值set_na_rep

(df.style
   .set_na_rep("FAIL")
   .format(None, na_rep="PASS", subset=["D"])
   .highlight_null("yellow"))

隐藏索引hide_index或列hide_columns

# 隐藏索引
df.style.hide_index()
#隐藏列
df.style.hide_columns(['C','D'])

8. 导出为Excel(还在开发实验阶段)

DataFrames 使用「OpenPyXL」「XlsxWriter」引擎可以将样式导出到Excel工作表。CSS2.2处理的属性包括:

  • background-color

  • border-style, border-width, border-color and their { top, right, bottom, left variants}

  • color

  • font-family

  • font-style

  • font-weight

  • text-align

  • text-decoration

  • vertical-align

  • white-space: nowrap

  • 当前仅支持CSS2命名或十六进制颜色,格式为 #rgb#rrggbb

df.style.\
    applymap(color_negative_red).\
    apply(highlight_max).\
    to_excel('styled.xlsx', engine='openpyxl')

以上内容参考自:https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html

---------End---------

关注后回复“w”,加我私人微信


分享”和“在看”是更好的支持!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lemonbit/article/details/107502774

智能推荐

软件测试周刊(第86期):一个人为寻求他所需要的东西,走遍了全世界。回到家里,找到了。_王小波 软件测试-程序员宅基地

文章浏览阅读1.2k次。全链路压测改造之全链自动化测试实践;vivo 基于 JaCoCo 的测试覆盖率设计与实践;Node.js 有哪些可以运用的测试框架?如何有效地进行代码 Review?代码覆盖率在性能优化上的一种可行应用;一文搞懂前端兼容问题;到底什么是商业模式?..._王小波 软件测试

CentOS 7 配置国内镜像源_centos7国内镜像-程序员宅基地

文章浏览阅读3.8k次。一般为大家所熟知的有:阿里云、清华大学、中科大,在这里我们使用中科大的源进行配置。在进行此类更改时候,先对系统默认源文件进行备份,备份是一个很好的习惯,此处如果权限不够,就使用root权限:更改默认源对于CentOS 7,使用以下命令更改默认源:刚才的命令只是更新了源,然后需要重建缓存,使用命令:之后我们可以看到重建缓存的进度,如果下载速度是正常的国内软件下载速度,那就成功了。_centos7国内镜像

Error: messages are only compatible with the docker image format (-f docker)-程序员宅基地

文章浏览阅读936次。一.过程介绍在使用docker commit从容器创建一个新的镜像的时候,一直提示命令不符合docker镜像的格式。根据提示将语句修改为podman commit -a "com.manu" -m "first docker image" -f docker 85f05b47ea9d manu/mycentos:1.01这个时候又显示了一个Error提示,并且commit成功了二.原因 查询了一下这是由于我操作系统是centos8版本的,其默认的容器..._error: messages are only compatible with the docker image format (-f docker)

java运用HashMap类统计英文网站上单词与字母出现的次数,保存文件中_java哈希表统计词频-程序员宅基地

文章浏览阅读1.9k次,点赞8次,收藏15次。前言这个程序是java选修课的作业,网上找不到合适的代码,于是自己花费了大量时间整理资料,最后实现功能,有感自己的辛苦,和人民的需求,分享一下。类import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOExce..._java哈希表统计词频

网络ICMP 协议详解-程序员宅基地

文章浏览阅读9.1k次,点赞9次,收藏46次。ICMP 的全称是Internet Control Message Protocol(互联网控制协议),它是一种互联网套件,它用于IP 协议中发送控制消息。也就是说,ICMP 是依靠 IP 协议来完成信息发送的,它是 IP 的主要部分,但是从体系结构上来讲,它位于 IP 之上,因为 ICMP 报文是承载在 IP 分组中的,就和 TCP 与 UDP 报文段作为 IP 有效载荷被承载那样。_icmp

Oracle:查找表的主键,外键,唯一性约束,索引_查找唯一键所有的外键-程序员宅基地

文章浏览阅读1.1k次。1、查找表的所有索引(包括索引名,类型,构成列):select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = 要查询的表2、查找表的主键(包括名称,_查找唯一键所有的外键

随便推点

腾讯会议、钉钉如何使用虚拟摄像头?详细教程_钉钉怎么开虚拟摄像头-程序员宅基地

文章浏览阅读2.3w次,点赞11次,收藏48次。虚拟摄像头简易教程一、准备工作(下载软件)① OBS② OBS-VirtualCam 虚拟摄像头插件③ 如果外网访问缓慢可以尝试站内下载二、安装开始一、准备工作(下载软件)① OBS一款免费开源的视频录制和直播软件官方下载源:https://obsproject.com/download② OBS-VirtualCam 虚拟摄像头插件安装后会产生一个虚拟摄像头,可以放置图片或者视频等Github下载:https://github.com/CatxFish/obs-virtual-c_钉钉怎么开虚拟摄像头

小程序中自定义图片预览功能_小程序自定义图片预览-程序员宅基地

文章浏览阅读1.5k次。1、问题:小程序开发文档中提供了wx.previewImage,可供开发者实现预览图片功能,但是不能隐藏保存本地的功能,因此编写如下项目,可供读者们使用,项目预览效果如下、代码提供在如下链接中,读者可自行下载本文为引用他人源码,如作者看到,请谅解..._小程序自定义图片预览

《深度学习》ing-8=10.2_chap6_rnn-程序员宅基地

文章浏览阅读383次。教材《深度学习》by Ian Goodfellow学习周期6.28_chap6_rnn

Chisel-xcode 下的调试神器_xcode debug插件-程序员宅基地

文章浏览阅读206次。在平时的测试工作中,当拿到一个新的工程,面对demo 的各种控件,要查看当前控件对象的类的继承关系,可以通过pclass来查看,比如UIViewController处设置断点,呼出lldb控制台,然后再这里输入pclass这个命令,其中参数0x10400ba00为 tableView 对象的地址。除了需要对对象有一个纵向的认识外,要了解到对象之间的横向关系,使用presponder指令,如图五所示,列出了集成于tableView控件的消息传递链,方便我们查看消息是如何传递的。..._xcode debug插件

使用vue-cli创建项目,webpack打包_vue_cli创建的项目完成后需要用webpack打包吗-程序员宅基地

文章浏览阅读646次。1.准备环境(nodejs下载和设置环境变量)2._vue_cli创建的项目完成后需要用webpack打包吗