当前pandas
版本为:1.2.5。
概述
jupyter notebook
能够风靡python数据科学圈的重要原因之一就是可以便捷的显示pandas
数据结构。
pandas
数据结构在jupyter notebook
中以表格形式呈现。这些表格的格式化依赖于pandas
中的styler
对象。dateframe.style
属性返回值为styler
对象。
styler
对象通过生成css样式进行格式化。
styler
类定义在pandas/io/formats/style.py
中,具体原理随后详述。
接口概述
格式化主要通过以下方法实现。
styler.applymap
:作用于元素styler.apply
:作用于行、列或整个表
上述方法的调用签名为:
styler.applymap(func)
:用于dataframe元素styler.apply(func, axis=0)
:用于按列设置样式styler.apply(func, axis=1)
:用于按行设置样式styler.apply(func, axis=none)
:用于按表格设置样式
以上方法中的func
参数即样式回调函数的具体要求如下:
- 回调函数的返回值类型为字符串,格式为css属性,即
attribute: value
。 - 回调函数的参数与返回值的形状(shape)要一致,即
func(x).shape == x.shape
。
由于styler.applymap
和styler.apply
的返回值均为styler
对象,因此,pandas
设计了样式的链式调用,即类似styler.apply.apply
的调用方式,这时样式相互叠加。
styler.applymap
和styler.apply
都可以接收subset
参数,用于指定样式作用的范围,相当于对dataframe进行切片操作。该参数有三种取值形式:
- 标量(整数、字符串):列标签
- 列表、系列(series)或numpy array
- 元组:(行索引, 列索引)
styler
对象具有_repr_html_
方法,因此在notebook环境中会自动渲染。
styler
对象的render()
方法可返回html字符串。
案例基础
import pandas as pd
import matplotlib.pyplot as plt
score = pd.read_csv('./student_score.csv',encoding = 'gbk')
score
接口应用案例
案例1:styler.applymap(func)
演示(按元素格式化)
回调函数的参数为单一的元素,返回值为css属性字符串。作用范围为dataframe中的所有元素。
案例中dataframe中所有值大于80的元素显示为红色。
def color_red_item(s):
return 'color : red' if s>80 else ''
score.style.applymap(color_red_item)
案例2:styler.apply(func, axis=0)
演示(按列格式化)
回调函数的参数为dataframe中的列(series),返回值为css属性字符串列表。作用范围为dataframe中的所有列。
案例中每列最大值显示为红色。
def color_red(s):
return ['color : red' if v==s.max() else '' for v in s]
score.style.apply(color_red])
案例3:styler.apply(func, axis=1)
演示(按行格式化)
回调函数的参数为dataframe中的行,返回值为css属性字符串列表。作用范围为dataframe中的所有行。
案例中每行最大值显示为红色。
def color_red(s):
return ['color : red' if v==s.max() else '' for v in s]
score.style.apply(color_red,axis=1)
案例4:styler.apply(func, axis=none)
演示(按dataframe格式化)
回调函数的参数的类型为dataframe,返回值类型仍然为dataframe,元素值为css属性字符串。
注意!要求参数和返回值的结构和行列索引必须完全一致!
案例中值大于80的元素显示为红色。
import numpy as np
def color_red(s):
return pd.dataframe(np.where(s>80,'color : red',''),index=s.index, columns=s.columns )
score.style.apply(color_red,axis=none)
案例:回调函数多参数演示
回调函数支持多个参数,除第一个固定参数之外,其余参数在apply或applymap方法中作为关键字参数传入。
def color_red(s,threshold):
items = s > threshold
return ['color : red' if v else '' for v in items]
score.style.apply(color_red,threshold=90)
案例:多个样式链式调用演示
pandas支持链式调用多个样式,样式效果叠加。
def color_red(s):
return ['color : red' if v==s.max() else '' for v in s]
def highlight(s):
return 'background : yellow' if s>80 else ''
score.style.apply(color_red).applymap(highlight)
案例:演示subset
参数
subset
参数可显示样式设置的范围。
案例仅在高数和英语两列应用样式。
def color_red(s):
return ['color : red' if v==s.max() else '' for v in s]
score.style.apply(color_red, subset=['高数','英语'])