利用Pandas庫實(shí)現(xiàn)Excel條件格式自動(dòng)化
今天給大家隆重介紹一下如何利用Pandas實(shí)現(xiàn)Excel條件格式的自動(dòng)化內(nèi)容。
目錄:
1. 概述
2. 突出顯示單元格
2.1. 高亮缺失值
2.2. 高亮最大值
2.3. 高亮最小值
2.4. 高亮區(qū)間值
2.5. 高亮分位數(shù)
3. 色階(背景及文本漸變色)
3.1. 背景漸變色
3.2. 文本漸變色
4. 數(shù)據(jù)條
5. 數(shù)據(jù)格式化
6. 自定義格式函數(shù)
7. 其他
1. 概述
咱們先簡單介紹一下什么是表格條件格式可視化,以常用的Excel為例說明。
在Excel菜單欄里,默認(rèn)(選擇)開始菜單,在中間部位有個(gè)條件格式控件,里面就是關(guān)于表格條件格式的方方面面。主要包含突出顯示單元格規(guī)則、最前/最后規(guī)則、數(shù)據(jù)條、色階、圖標(biāo)集以及規(guī)則管理等。

基于以上,我們其實(shí)可以通過函數(shù)方式進(jìn)行多種條件的綜合,讓Excel表格可視化豐富多彩,比如以下截圖展示的就是色階效果!

在上圖中,我們對(duì)每列單獨(dú)進(jìn)行條件格式-色階設(shè)置,綠色->紅色 代表數(shù)值從小到大,可以很直觀的快速感受數(shù)值表現(xiàn)。
所謂 表格條件格式可視化,就是對(duì)表格的數(shù)據(jù)按照一定的條件進(jìn)行可視化的展示(這里的可視化更多是指單元格背景色、字體顏色以及文本格式顯示等)。
那么,Pandas作為表格化的數(shù)據(jù)處理工具,我們可以如何實(shí)現(xiàn) 表格條件格式可視化呢?!
大殺器:df.style
2. 突出顯示單元格
在Excel條件格式中,突出顯示單元格規(guī)則提供的是大于、小于、等于以及重復(fù)值等內(nèi)置樣式,不過在Pandas中這些需要通過函數(shù)方法來實(shí)現(xiàn),我們放在后續(xù)介紹。這里介紹Pandas突出顯示缺失值、最大值、最小值、區(qū)間值的函數(shù)方法以及Excel實(shí)現(xiàn)這些操作的自定義操作。
2.1. 高亮缺失值
df.style.highlight_null()
Signature:
df.style.highlight_null(
null_color: 'str' = 'red',
subset: 'Subset | None' = None,
props: 'str | None' = None,
) -> 'Styler'
Docstring:
Highlight missing values with a style.
null_color用于指定高亮的背景色,默認(rèn)是紅色
subset用于指定操作的列或行
props用于突出顯示CSS屬性(后面案例中會(huì)涉及到)

比如,我們可以指定高亮的背景色為橙色(顏色可以是英文名稱)

比如,我們可以指定高亮的背景色為紫紅色(顏色可以是16進(jìn)制)

2.2. 高亮最大值
df.style.highlight_max()
Signature:
df.style.highlight_max(
subset: 'Subset | None' = None,
color: 'str' = 'yellow',
axis: 'Axis | None' = 0,
props: 'str | None' = None,
) -> 'Styler'
Docstring:
Highlight the maximum with a style.
subset用于指定操作的列或行
color用于指定顏色,默認(rèn)是黃色
axis用于指定行最大、列最大或全部,默認(rèn)是列方向最大

這里我們發(fā)現(xiàn)對(duì)于中文也有列最大高亮,至于為啥是蒙古其實(shí)我也不清楚,為了避免出現(xiàn)這種情況,有兩種方法:①將這一列設(shè)置為索引(這里不做演示),②采用subset指定

指定顏色為灰色

顯示全部最大值

那么,Excel如何顯示最大值呢?這里我們以顯示全部最大值為例展開介紹,邏輯如下:
通過函數(shù)MAX獲取數(shù)據(jù)區(qū)域的最大值 然后編輯格式滿足單元格值等于這個(gè)最大值即可
操作為:選中數(shù)據(jù)區(qū)域,進(jìn)行條件格式設(shè)置->編輯格式規(guī)則
具體規(guī)則如下圖:

我們就可以得到想要的效果:

同樣的道理,我們可以根據(jù)需求高亮列或行的最大值、最小值等
2.3. 高亮最小值
df.style.highlight_min()
參數(shù)基本同高亮最大值,這里不再贅述,看案例

鏈?zhǔn)秸{(diào)用 最大最小值高亮

2.4. 高亮區(qū)間值
df.style.highlight_between
Signature:
df.style.highlight_between(
subset: 'Subset | None' = None,
color: 'str' = 'yellow',
axis: 'Axis | None' = 0,
left: 'Scalar | Sequence | None' = None,
right: 'Scalar | Sequence | None' = None,
inclusive: 'str' = 'both',
props: 'str | None' = None,
) -> 'Styler'
Docstring:
Highlight a defined range with a style.
subset用于指定操作的列或行
color用于指定顏色,默認(rèn)是黃色
axis用于指定行、列或全部,如果left或right作為序列給出,則應(yīng)用于這些序列的邊界
left用于指定區(qū)間最小值
right用于指定區(qū)間最大值
inclusive用于確定是否左右閉包,可選'both', 'neither', 'left', 'right'
props用于突出顯示CSS屬性
高亮數(shù)量在[20, 30]的單元格

props用于突出顯示CSS屬性,案例中我們將待高亮的部分顯示為字體顏色-白色,背景色-紫色

金牌數(shù)區(qū)間[20, 30]、銀牌數(shù)區(qū)間[10, 20]、銅牌數(shù)區(qū)間[5, 10]

2.5. 高亮分位數(shù)
df.style.highlight_quantile()
Signature:
df.style.highlight_quantile(
subset: 'Subset | None' = None,
color: 'str' = 'yellow',
axis: 'Axis | None' = 0,
q_left: 'float' = 0.0,
q_right: 'float' = 1.0,
interpolation: 'str' = 'linear',
inclusive: 'str' = 'both',
props: 'str | None' = None,
) -> 'Styler'
Docstring:
Highlight values defined by a quantile with a style.
subset用于指定操作的列或行
color用于指定顏色,默認(rèn)是黃色
axis用于指定行、列或全部
q_left用于指定分位數(shù)左邊界,默認(rèn)是0
q_right用于指定分位數(shù)右邊界,默認(rèn)是1
inclusive用于確定是否左右閉包,可選'both', 'neither', 'left', 'right'
props用于突出顯示CSS屬性
比如,高亮各列獎(jiǎng)牌數(shù)前15%的值

3. 色階(背景及文本漸變色)
色階部分包含背景漸變色和文本漸變色
3.1. 背景漸變色
在Excel中,直接通過條件格式->色階 操作即可選擇想要的背景漸變色效果

而在Pandas中,我們可以通過df.style.background_gradient()進(jìn)行背景漸變色的設(shè)置。
Signature:
df.style.background_gradient(
cmap='PuBu',
low: 'float' = 0,
high: 'float' = 0,
axis: 'Axis | None' = 0,
subset: 'Subset | None' = None,
text_color_threshold: 'float' = 0.408,
vmin: 'float | None' = None,
vmax: 'float | None' = None,
gmap: 'Sequence | None' = None,
) -> 'Styler'
Docstring:
Color the background in a gradient style.
cmap用于指定matplotlib色條
low和high用于指定最小最大值顏色邊界,區(qū)間[0, 1]
axis用于指定行、列或全部,默認(rèn)是列方向
subset用于指定操作的列或行
text_color_threshold用于指定文本顏色亮度,區(qū)間[0, 1]
vmin和vmax用于指定與cmap最小最大值對(duì)應(yīng)的單元格最小最大值

low和high用于指定最小最大值顏色邊界,區(qū)間[0, 1]

cmap用于指定matplotlib色條,采用seaborn美化樣式

text_color_threshold用于指定文本顏色亮度,區(qū)間[0, 1]

vmin和vmax用于指定與cmap最小最大值對(duì)應(yīng)的單元格最小最大值(10以下同色,70以上同色)

我們可以看到以上對(duì)于缺失值來說,其背景色是黑色,我們可以通過鏈?zhǔn)椒椒ê透吡寥笔е祵?duì)缺失值背景色進(jìn)行修改

3.2. 文本漸變色
文本漸變色顧名思義就是對(duì)單元格的文本進(jìn)行顏色漸變,可以通過df.style.text_gradient()來操作,其參數(shù)和背景漸變色基本一致。

4. 數(shù)據(jù)條
在Excel中,直接通過條件格式->數(shù)據(jù)條 操作即可選擇想要的數(shù)據(jù)條效果

而在Pandas中,我們可以通過 df.style.bar()來進(jìn)行數(shù)據(jù)條繪制
Signature:
df.style.bar(
subset: 'Subset | None' = None,
axis: 'Axis | None' = 0,
color='#d65f5f',
width: 'float' = 100,
align: 'str' = 'left',
vmin: 'float | None' = None,
vmax: 'float | None' = None,
) -> 'Styler'
Docstring:
Draw bar chart in the cell backgrounds.
subset用于指定操作的列或行
axis用于指定行、列或全部,默認(rèn)是列方向
color用于指定數(shù)據(jù)條顏色
width用于指定數(shù)據(jù)條長度,默認(rèn)是100,區(qū)間[0, 100]
vmin和vmax用于指定與數(shù)據(jù)條最小最大值對(duì)應(yīng)的單元格最小最大值
align數(shù)據(jù)條與單元格對(duì)齊方式,默認(rèn)是left左對(duì)齊,還有zero居中和mid位于(max-min)/2
比如,獎(jiǎng)牌數(shù)(不算總的)最低0最高40+顏色為橙色+居中展示,金牌差數(shù)據(jù)條長度為50(也就是單元格一半的長度)、銀牌差mid對(duì)齊+數(shù)據(jù)條為單元格一半長度+正負(fù)顯示不同顏色

5. 數(shù)據(jù)格式化
調(diào)整數(shù)據(jù)格式用到df.style.format()
Signature:
df.style.format(
formatter: 'ExtFormatter | None' = None,
subset: 'Subset | None' = None,
na_rep: 'str | None' = None,
precision: 'int | None' = None,
decimal: 'str' = '.',
thousands: 'str | None' = None,
escape: 'str | None' = None,
) -> 'StylerRenderer'
Docstring:
Format the text display value of cells.
formatter顯示格式
subset用于指定操作的列或行
na_rep用于指定缺失值的格式
precision用于指定浮點(diǎn)位數(shù)
decimal用于用作浮點(diǎn)數(shù)、復(fù)數(shù)和整數(shù)的十進(jìn)制分隔符的字符,默認(rèn)是.
thousands用作浮點(diǎn)數(shù)、復(fù)數(shù)和整數(shù)的千位分隔符的字符
escape用于特殊格式輸出(如html、latex等,這里不做展開,可參考官網(wǎng))比如,我們給數(shù)據(jù)加上單位
枚,缺失值顯示為無

設(shè)置小數(shù)點(diǎn)位數(shù)為0

指定列進(jìn)行格式化

分別對(duì)指定列進(jìn)行單獨(dú)格式化

6. 自定義格式函數(shù)
通過傳遞樣式函數(shù)來自定義格式:
applymap()(elementwise):接受一個(gè)函數(shù),它接受一個(gè)值并返回一個(gè)帶有 CSS 屬性值對(duì)的字符串。
apply()(column-/ row- /table-wise): 接受一個(gè)函數(shù),它接受一個(gè) Series 或 DataFrame 并返回一個(gè)具有相同形狀的 Series、DataFrame 或 numpy 數(shù)組,其中每個(gè)元素都是一個(gè)帶有 CSS 屬性的字符串-值對(duì)。此方法根據(jù)axis關(guān)鍵字參數(shù)一次傳遞一個(gè)或整個(gè)表的 DataFrame 的每一列或行。對(duì)于按列使用axis=0、按行使用axis=1,以及一次性使用整個(gè)表axis=None。
比如,我們定義一個(gè)函數(shù),如果金牌數(shù)<銀牌數(shù),則高亮金牌數(shù)這一列對(duì)應(yīng)的值

比如,我們還可以定義函數(shù),如果金牌數(shù)<銀牌數(shù),則這一行數(shù)據(jù)都高亮

又或者,我們可以根據(jù)不同的比值對(duì)每行進(jìn)行不同的高亮

關(guān)于以上函數(shù)的寫法,我們還可以調(diào)用numpy的where和repeat方法進(jìn)行優(yōu)化,如:

7. 其他
還有一些小操作,比如添加標(biāo)題、隱藏索引、隱藏指定列等等
添加標(biāo)題

隱藏索引

隱藏指定列

設(shè)置屬性
如果一些單元格屬性和單元格值無關(guān),我們可以通過df.style.set_properties()來進(jìn)行定制化操作,比如:背景色-黑色,字體顏色-草綠色,邊框顏色-白色。(css樣式)

選中放大

鼠標(biāo)選擇單元格會(huì)有放大效果

導(dǎo)出Excel
就直接to_excel就行了,dfs = df.style.xxx,然后dfs.to_excel()

導(dǎo)出html

以上就是本次全部內(nèi)容,大家感興趣的話可以自己演示一遍熟悉熟悉,又或者想想日常工作中的一些條件格式需求,然后通過Pandas演示出來效果看看。





