赞
踩
Pandas提供的样式功能可实现:
样式和可视化图形的区别: 数据图形化不关注具体数据内容,而样式则在保留具体内容的基础上进行修饰,让可读性更强。
DataFrame有一个Styler对象,用来生成数据样式,样式用CSS完成。
(1)df.style可以在Jupyter Notebook未给样式的情况下显示所有数据。
# 读取数据
df = pd.read_excel('https://www.gairuo.com/file/data/dataset/team.xlsx')
# 样式对象
df.style
所有的样式功能都在df.style里。
注意: 输出的是一个Styler对象,不是DataFrame,原始DataFrame内容并没有改变。
(2)查看类型:
type(df.style)
# pandas.io.formats.style.Styler
(1)style.highlight_null() 对为空的值高亮标示,增加背景颜色:
# 将一个值修改为空
df.iloc[1, 1] = np.NaN
# 将空值高亮,默认为红色背景
df.head().style.highlight_null()
(2)可以指定颜色:
# 使用颜色名
df.head().style.highlight_null(null_color='blue')
# 使用颜色值
df.head().style.highlight_null(null_color='#ccc')
(1)在列级上操作:
①最大值高亮:
df.head().style.highlight_max()
②最小值高亮:
df.head().style.highlight_min()
③二者同时高亮并指定颜色:
(df.head()
.style.highlight_max(color='lime')
.highlight_min() # 将最小值高亮
)
(2)在行级操作(axis=1):
# 指定行级
(
df.head()
.style.highlight_max(color='lime', axis=1) # 最大值高亮,绿色
.highlight_min(axis=1)
)
(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'])
根据数值大小,背景颜色呈现梯度渐变,越深表示越大。颜色指定为Matplotlib库的色系表的色系名。
(1)**background_gradient()**会对数字按大小用背景色深浅表示:
df.head().style.background_gradient()
(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)示例:
# 显示Q4列的条形图
df.head().style.bar(subset=['Q4'], vmin=50, vmax=100)
(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~100,100占满 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)
(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 值居中
)
最终输出数据进行查看的时候,需要对数据进行相应的格式化,比如加货币符号、加百分号、增加千分位,目的是让计数更加场景化,明确一定业务意义。
Styler.format专门用来处理格式化。
Styler.format(self, formatter,
subset=None,
na_rep: Union[str, NoneType]=None)
formatter 可以是(str, callable, dict, None)中的任意一个,一般是一个字典(由列名和格式组成),也可以是一个函数。
# 百分号
df.style.format("{:.2%}") # 只对数字列成立
# 指定列变大写
df.style.format({'name': str.upper})
# B,保留四位;D,两位小数并显示正负号
df.style.format({'B': "{:0<4.0f}", 'D': '{:+.2f}'})
# 常用格式
{'a': '¥{0:, .0f}', # 人民币
'b': '{:%Y-%m}', # 年月
'c': '{:.2%}', # 百分号
'd': {':,f'}, # 千分位
'e': str.upper} # 大写
显示格式可以多次设定,也可以与颜色相关样式一起使用。
# 链式方法使用格式
(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}"})
)
Pandas可以对样式进行一些整体性配置,同时,还提供了一些操作方法,使样式内容的输出更为丰富。
(1).set_caption(‘xxx’) 给显示的表格数据增加标题:
df.head().style.set_caption('学生成绩表')
(2).set_precision() 设置全局的数据精度,保留小数位数:
# 保留两位小数
df.style.set_precision(2)
# 等同于
df.round(2).style
(3).set_na_rep() 设置缺失值的统一显示:
# 缺失值的显示
na = np.nan
(
df.head()
.style.set_na_rep("暂无")
)
(4)隐藏索引和列:
# 不输出索引
df.style.hide_index()
# 不输出指定列
df.style.hide_columns(['Q3', 'Q4'])
(1).set_properties() 给单元格配置CSS样式:
# 将Q1列文字设为红色
df.head().style.set_properties(subset=['Q1'], **{'color': 'red'})
其他示例:
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'})
(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"> ...
(3).set_table_styles() 用于设置表格样式属性。
可以带有选择器和props键的字典。
选择器selector的值是样式将应用此CSS样式的内容,props是由CSS样式属性和值组成的元组列表。
# 给所有的行(tr标签)的hover方法设置黄色背景
# 效果是当鼠标移动上去时整行背景变黄
df.style.set_table_styles(
[{'selector': 'tr:hover',
'props': [('background-color', 'yellow')]}]
)
(4)单元格符缀.set_uuid() 为每个单元格的td标签id属性值中增加一个符缀,这个符缀可用作JavaScript做数据处理时的区分。
# 为每个表格增加一个相同的符缀
df.style.set_uuid(9999)
# ...<td id="T_9999row0_col2"> ...
Styler可以使用apply和applymap定义复杂样式。
(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)
(2)applymap() 对全表起作用。
将所有值大于90分的格子背景设为黄色:
# 定义函数,只对数字起作用
bg = lambda x: 'background-color: yellow' if type(x)== int and x >90 else ''
# 应用函数
df.style.applymap(bg)
(3)subset可以限制应用的范围:
# 指定列表(值>0)加背景色
df.style.applymap(lambda x: 'background-color: grey' if x>0 else '',
subset=pd.IndexSlice[:, ['Q1', 'Q2']])
(4)样式支持pipe管道方法,下例实现了将字体放大和将name列全大写的方法:
# 定义样式函数
def my_style(styler):
return (styler.set_properties(**{'font-size': '200%'})
.format({'name': str.upper}))
# 应用管道方法`在这里插入代码片`
df.style.pipe(my_style)
可以将数据和样式应用到新表格。
# 将df的样式赋值给变量
style1 = df.style.applymap(color_negative_red)
# df2的样式为style2
style2 = df2.style2
# style2使用style1的样式
style2.use(style1.export())
df.style.clear() 会返回None,清除所有样式。
# 定义为一个变量
dfs = df.loc[:, 'Q1':'Q4'].style.apply(highlight_max)
dfs.clear() # 清除
# 此时dfs不带任何样式,但还是Styler对象
可以将样式生成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)Styler.render() 可以输出样式的HTML代码,它可以传入以下参数:
(2)生成的HTML代码可以用于网页显示、邮件正文内容等场景:
# 生成HTML
df.style.render()
# 过滤换行符,读取部分数据,增加可读性
df.style.highlight_null().render().split('\n')[:10]
(3)在Jupyter Notebook中,为了得到更好的浏览体验,可以用IPython来展示生成的HTML效果:
from IPython.display import HTML
HTML(df.style.render())
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。