前言
在之前的很多文章中我們都說過,Pandas
與openpyxl
有一個很大的區別就是openpyxl可以進行豐富的樣式調整,但其實在Pandas中每一個DataFrame都有一個Style
屬性,我們可以通過修改該屬性來給數據添加一些基本的樣式。
使用說明
我們可以編寫樣式函數,並使用CSS來控制不同的樣式效果,通過修改Styler
對象的屬性,將樣式傳遞給DataFrame,主要有兩種傳遞方式
- Styler.applymap:逐元素
- Styler.apply:列/行/表方式
Styler.applymap
通過DataFrame逐個元素地工作。Styler.apply
根據axis參數,按列使用axis=0,按行使用axis=1,以及axis=None作用於整個表。所以若使用Styler.applymap
,我們的函數應返回帶有CSS屬性-值對的單個字符串。若使用Styler.apply
,我們的函數應返回具有相同形狀的Series或DataFrame,其中每個值都是具有CSS屬性值對的字符串。
不會CSS?沒關係,作爲調包俠的我們大多是改改HTML顏色代碼即可完成樣式修改,下面看一些示例。
一些例子
基本樣式
首先我們創建一組沒有任何樣式的數據
我們之前說過,DataFrame是有style屬性的,所以在沒有做任何修改的情況下,使用df.style應該和上圖一樣
現在讓我們編寫一個簡單的樣式函數,該函數可以將負數變爲紅色,使正數保持黑色。
def color_negative_red(val):
color = 'red' if val < 0 else 'black'
return 'color: %s' % color
現在來應用這段函數(思考Excel如何實現)
現在如果我們想突出顯示每列中的最大值,需要重新定義一個函數
def highlight_max(s):
is_max = s == s.max()
return ['background-color: yellow' if v else '' for v in is_max]
因爲之前我們是以元素爲單位判斷,所以使用的是.applymap
,所以現在我們應對列進行.apply``操作
現在可以使用
df.style.applymap(color_negative_red).apply(highlight_max)
來混合修改樣式或使用.\實現
當然我們也可以通過修改樣式函數並使用.apply來高亮整個DataFrame的最大值,
切片
當然我們也可以使用subset通過切片來完成對指定列進行樣式修改,比如高亮部分列的最大值
df.style.apply(highlight_max, subset=['B', 'C', 'D'])
對於行和列切片,可以使用我們熟悉的.loc
,不過目前僅支持基於標籤的切片,不支持位置切片。
格式化輸出
我們也可以使用Styler.format來快速格式化輸出,比如將小數格式化爲百分數
也支持使用字典或lambda表達式來更靈活的使用
當然是支持和之前的樣式結合使用
內置樣式
開發者們爲了儘可能的讓作爲調包俠的我們使用起來更方便,已經內置了很多寫好的樣式,拿走就用,比如將空值設置爲紅色
或是結合seaborn使用熱力圖
現在我們就可以通過修改Styler.background_gradient來輕鬆的修改顏色等樣式
最後我們可以將數據修改爲條形圖的樣式,這也是我最喜歡的一個功能,能夠快速的看出數據的變化!
在最新的版本中可以進一步自定義條形圖:我們現在可以將df.style.bar
以零或中點值爲中心來快速觀察數據變化,並可以傳遞顏色[color_negative, color_positive]
,比如使用align='mid'
:
以上就是對Pandas中如何修改樣式的一個簡單介紹,更多的操作可以在官方文檔https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html
中找到與學習。