• 【学习笔记】《深入浅出Pandas》第15章:Pandas样式


    15.1 内置样式

    15.1.1 样式功能

    Pandas提供的样式功能可实现:

    • 数值格式化,如千分号、小数位数、货币符号、日期格式、百分比等;
    • 凸显某些数据,对行、列或特定的值使用样式,如字体大小、黄色、背景;
    • 显示数据关系,如用颜色深浅代表数据大小;
    • 迷你条形图,如在一个百分比格子里,用颜色比例表示占比;
    • 表达趋势,类似Excel中每行代表趋势变化的迷你走势图。

    样式和可视化图形的区别: 数据图形化不关注具体数据内容,而样式则在保留具体内容的基础上进行修饰,让可读性更强。

    15.1.2 Styler对象

    DataFrame有一个Styler对象,用来生成数据样式,样式用CSS完成。

    (1)df.style可以在Jupyter Notebook未给样式的情况下显示所有数据。

    # 读取数据
    df = pd.read_excel('https://www.gairuo.com/file/data/dataset/team.xlsx')
    # 样式对象
    df.style
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    所有的样式功能都在df.style里。
    注意: 输出的是一个Styler对象,不是DataFrame,原始DataFrame内容并没有改变。
    (2)查看类型

    type(df.style)
    # pandas.io.formats.style.Styler
    
    • 1
    • 2

    15.1.3 空值高亮

    (1)style.highlight_null() 对为空的值高亮标示,增加背景颜色:

    # 将一个值修改为空
    df.iloc[1, 1] = np.NaN
    # 将空值高亮,默认为红色背景
    df.head().style.highlight_null()
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述(2)可以指定颜色

    # 使用颜色名
    df.head().style.highlight_null(null_color='blue')
    # 使用颜色值
    df.head().style.highlight_null(null_color='#ccc')
    
    • 1
    • 2
    • 3
    • 4

    15.1.4 极值高亮

    (1)在列级上操作:
    最大值高亮:

    df.head().style.highlight_max()
    
    • 1

    在这里插入图片描述
    最小值高亮:

    df.head().style.highlight_min()
    
    • 1

    二者同时高亮并指定颜色

    (df.head()
     .style.highlight_max(color='lime')
     .highlight_min() # 将最小值高亮
    )
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述(2)在行级操作(axis=1):

    # 指定行级
    (
        df.head()
        .style.highlight_max(color='lime', axis=1) # 最大值高亮,绿色
        .highlight_min(axis=1)
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述(3)用于指定行

    # 只对Q1起作用
    df.style.highlight_min(subset=['Q1'])
    
    # 使用pd.IndexSlice索引器(和loc[]类似)
    # 注意,数据是所有数据,算最小值的范围而不是全部
    df.style.highlight_min(subset=pd.IndexSlice[:10, ['Q1', 'Q3']])
    
    # 按行,只在这两列进行
    df.style.highlight_min(axis=1, subset=['Q1', 'Q2'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    15.1.5 背景渐变

    根据数值大小,背景颜色呈现梯度渐变,越深表示越大。颜色指定为Matplotlib库的色系表的色系名。

    (1)**background_gradient()**会对数字按大小用背景色深浅表示:

    df.head().style.background_gradient()
    
    • 1

    在这里插入图片描述
    (2)常用的参数如下:

    # 指定列,指定颜色系列
    df.style.background_gradient(subset=['Q1'], cmap='BuGn')
    # 低百分比和高百分比范围,更换颜色时避免使用所有色域
    df.style.background_gradient(low=0.6, high=0)
    # 内容颜色,取0~1(深色到浅色),突显文本
    df.style.background_gradient(text_color_threshold=0.5)
    # 颜色应用的取值范围,不在这个范围的不应用
    df.style.background_gradient(vmin=60, vmax=100)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    15.1.6 条形图

    条形图在表格里一般以横向柱状图的形式代表这个值的大小。

    (1)示例:

    # 显示Q4列的条形图
    df.head().style.bar(subset=['Q4'], vmin=50, vmax=100)
    
    • 1
    • 2

    在这里插入图片描述(2)常用参数

    # 基本用法,默认对数字应用
    df.style.bar()
    # 指定应用范围
    df.style.bar(subset=['Q1'])
    # 指定颜色
    df.style.bar(color='green')
    df.style.bar(color='#ff11bb')
    # 以行方向进行计算和展示
    df.style.bar(axis=1)
    # 样式在格中的占位百分比,0~100100占满
    df.style.bar(width=80)
    # 对齐方式
    # 'left':最小值开始
    # 'zero':0值在中间
    # 'mid':(max-min)/2 值在中间,负值0在右
    df.style.bar(align='mid')
    # 大小基准值
    df.style.bar(vmin=60, vmax=100)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    (3)综合示例:

    (df.head(5)
     .assign(avg=df.mean(axis=1, numeric_only=True)) # 增加平均值
     .assign(diff=lambda x: x.avg.diff()) # 和前一位同学的差值
     .style
     .bar(color='yellow', subset=['Q1'])
     .bar(subset=['avg'],
          width=90,
          align='mid',
          vmin=60, vmax=100,
          color='#5CADAD')
     .bar(subset=['diff'],
          color=['#ffe4e4', '#bbf9ce'], # 上涨和下降的颜色
          vmin=0, vmax=30, # 范围定位以0为基准的上下30
          align='zero') # 0 值居中
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    15.2 显示格式

    最终输出数据进行查看的时候,需要对数据进行相应的格式化,比如加货币符号、加百分号、增加千分位,目的是让计数更加场景化,明确一定业务意义。
    Styler.format专门用来处理格式化。

    15.2.1 语法结构

    Styler.format(self, formatter,
                  subset=None,
                  na_rep: Union[str, NoneType]=None)
    
    • 1
    • 2
    • 3

    formatter 可以是(str, callable, dict, None)中的任意一个,一般是一个字典(由列名和格式组成),也可以是一个函数。

    15.2.2 常用方法

    # 百分号
    df.style.format("{:.2%}") # 只对数字列成立
    
    # 指定列变大写
    df.style.format({'name': str.upper})
    
    # B,保留四位;D,两位小数并显示正负号
    df.style.format({'B': "{:0<4.0f}", 'D': '{:+.2f}'})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    # 常用格式
    {'a': '¥{0:, .0f}', # 人民币
     'b': '{:%Y-%m}', # 年月
     'c': '{:.2%}', # 百分号
     'd': {':,f'}, # 千分位
     'e': str.upper} # 大写
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    15.2.3 综合运用

    显示格式可以多次设定,也可以与颜色相关样式一起使用。

    # 链式方法使用格式
    (df.head(15)
     .head(10)
     .assign(avg=df.mean(axis=1, numeric_only=True)/100) # 增加平均值百分比
     .assign(diff=lambda x: x.avg.diff()) # 与前一位同学的差值
     .style
     .format({'name': str.upper})
     .format({'avg': "{:.2%}"})
     .format({'diff': "¥{:.2f}"})
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    15.3 样式高级操作

    Pandas可以对样式进行一些整体性配置,同时,还提供了一些操作方法,使样式内容的输出更为丰富。

    15.3.1 样式配置操作

    (1).set_caption(‘xxx’) 给显示的表格数据增加标题

    df.head().style.set_caption('学生成绩表')
    
    • 1

    在这里插入图片描述(2).set_precision() 设置全局的数据精度,保留小数位数

    # 保留两位小数
    df.style.set_precision(2) 
    # 等同于
    df.round(2).style
    
    • 1
    • 2
    • 3
    • 4

    (3).set_na_rep() 设置缺失值的统一显示:

    # 缺失值的显示
    na = np.nan
    (
        df.head()
        .style.set_na_rep("暂无")
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述(4)隐藏索引和列:

    # 不输出索引
    df.style.hide_index()
    # 不输出指定列
    df.style.hide_columns(['Q3', 'Q4'])
    
    • 1
    • 2
    • 3
    • 4

    15.3.2 表格CSS样式

    (1).set_properties() 给单元格配置CSS样式

    # 将Q1列文字设为红色
    df.head().style.set_properties(subset=['Q1'], **{'color': 'red'})
    
    • 1
    • 2

    在这里插入图片描述其他示例:

    df.head().style.set_properties(color='white', align="right")
    df.head().style.set_properties(**{'background-color': 'yellow'})
    df.head().style.set_properties(**{'width': '100px', 'font-size': '18px'})
    df.head().style.set_properties(**{'background-color': 'black',
                                      'color': 'lawngreen',
                                      'border-color': 'white'})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (2).set_table_attributes() 用于给< table >标签增加属性,可以随意给定属性名和属性值:

    df.head().style.set_table_attributes('class="pure-table"')
    # ...<table class="pure-table"> ...
    df.head().style.set_table_attributes('id="gairuo-table"')
    # ...<table id="gairuo-table"> ...
    
    • 1
    • 2
    • 3
    • 4

    (3).set_table_styles() 用于设置表格样式属性。
    可以带有选择器和props键的字典。
    选择器selector的值是样式将应用此CSS样式的内容,props是由CSS样式属性和值组成的元组列表。

    # 给所有的行(tr标签)的hover方法设置黄色背景
    # 效果是当鼠标移动上去时整行背景变黄
    df.style.set_table_styles(
        [{'selector': 'tr:hover',
          'props': [('background-color', 'yellow')]}]
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述(4)单元格符缀.set_uuid() 为每个单元格的td标签id属性值中增加一个符缀,这个符缀可用作JavaScript做数据处理时的区分。

    # 为每个表格增加一个相同的符缀
    df.style.set_uuid(9999)
    # ...<td id="T_9999row0_col2"> ...
    
    • 1
    • 2
    • 3

    15.3.3 应用函数

    Styler可以使用applyapplymap定义复杂样式。

    (1)用apply函数实现将最大值显示为红色:

    # 将最大值显示红色
    def highlight_max(x):
        return ['color: red' if v == x.max() else '' for v in x]
    # 按行应用   
    df.loc[:, 'Q1':'Q4'].style.apply(highlight_max, axis=1)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述(2)applymap()全表起作用。
    将所有值大于90分的格子背景设为黄色:

    # 定义函数,只对数字起作用
    bg = lambda x: 'background-color: yellow' if type(x)== int and x >90 else ''
    
    # 应用函数
    df.style.applymap(bg)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述(3)subset可以限制应用的范围:

    # 指定列表(值>0)加背景色
    df.style.applymap(lambda x: 'background-color: grey' if x>0 else '',
                      subset=pd.IndexSlice[:, ['Q1', 'Q2']])
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    (4)样式支持pipe管道方法,下例实现了将字体放大和将name列全大写的方法:

    # 定义样式函数
    def my_style(styler):
        return (styler.set_properties(**{'font-size': '200%'})
                .format({'name': str.upper}))
    
    # 应用管道方法`在这里插入代码片`
    df.style.pipe(my_style)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    15.3.4 样式复用

    可以将数据和样式应用到新表格

    # 将df的样式赋值给变量
    style1 = df.style.applymap(color_negative_red)
    # df2的样式为style2
    style2 = df2.style2
    # style2使用style1的样式
    style2.use(style1.export())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    15.3.5 样式清除

    df.style.clear() 会返回None,清除所有样式。

    # 定义为一个变量
    dfs = df.loc[:, 'Q1':'Q4'].style.apply(highlight_max)
    dfs.clear() # 清除
    # 此时dfs不带任何样式,但还是Styler对象
    
    • 1
    • 2
    • 3
    • 4

    15.3.6 导出Excel

    可以将样式生成HTML和导出Excel
    生成HTML可以用来发邮件,做网页界面;生成Excel可以做二次处理或者传播。

    样式导出Excel后会保留原来定义的大多数样式。

    # 导出Excel
    df.style.to_excel('gairuo.xlsx')
    # 使用指定引擎
    df.style.to_excel('gairuo.xlsx', engine='openpyxl')
    # 指定标签页名称 sheet name
    dfs.to_excel('gairuo.xlsx', sheet_name="Sheet1")
    # 指定缺失值的处理方式
    dfs.to_excel('gairuo.xlsx', na_rep='-')
    # 浮点数字格式,下例将0.1234转为0.12
    dfs.to_excel('gairuo.xlsx', float_format="%.2f")
    # 只要这两列
    dfs.to_excel('gairuo.xlsx', columns=['Q1', 'Q2'])
    # 不带表头
    dfs.to_excel('gairuo.xlsx', header=False)
    # 不带索引
    dfs.to_excel('gairuo.xlsx', index=False)
    # 指定索引,多个值代表多层索引
    dfs.to_excel('gairuo.xlsx', index_label=['team', 'name'])
    # 从哪行取,从哪列取
    dfs.to_excel('gairuo.xlsx', startrow=10, startcol=3)
    # 不合并单元格
    dfs.to_excel('gairuo.xlsx', merge_cells=False)
    # 指定编码方式
    dfs.to_excel('gairuo.xlsx', encoding='utf-8')
    # 无穷大表示法(Excel中没有无穷大的本机表示法)
    dfs.to_excel('gairuo.xlsx', inf_rep='inf')
    # 在错误日志中显示更多信息
    dfs.to_excel('gairuo.xlsx', verbose=True)
    # 指定要冻结的最底行和最右列
    dfs.to_excel('gairuo.xlsx', freeze_panes=(0, 2))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    15.3.7 生成HTML

    (1)Styler.render() 可以输出样式的HTML代码,它可以传入以下参数:

    • head
    • cellstyle
    • body
    • uuid
    • precision
    • table_styles
    • caption
    • table_attributes

    (2)生成的HTML代码可以用于网页显示、邮件正文内容等场景:

    # 生成HTML
    df.style.render()
    # 过滤换行符,读取部分数据,增加可读性
    df.style.highlight_null().render().split('\n')[:10]
    
    • 1
    • 2
    • 3
    • 4

    (3)在Jupyter Notebook中,为了得到更好的浏览体验,可以用IPython来展示生成的HTML效果:

    from IPython.display import HTML
    HTML(df.style.render())
    
    • 1
    • 2
  • 相关阅读:
    Leetcode169题 | 多数元素(python解法)
    Power BI 和 Tableau的区别
    Canonical 发布公告,Ubuntu可以在 Windows 10 商店找到
    计算机毕业设计Java大学生学科竞赛管理系统(源码+系统+mysql数据库+lw文档)
    Windows系统Android Studio断点调试Android源码
    Linux ARM平台开发系列讲解(网络篇) 2.3 Marvell 88EA6321/88EA6320 Switch 设备树的配置分析
    API接口请求电商数据平台参数获取淘宝商品描述示例
    《C和指针》笔记34:字符串函数
    数据化管理洞悉零售及电子商务——数据分析方法
    Qt/Flutter/Lvgl/Native,总有一个适合你的UI
  • 原文地址:https://blog.csdn.net/weixin_43894455/article/details/127547173