当前位置:   article > 正文

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

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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/202144
推荐阅读
相关标签
  

闽ICP备14008679号