Pandas的style
用法在大多數(shù)教程中見的比較少,它主要是用來美化DataFrame
和Series
的輸出,能夠更加直觀地顯示數(shù)據(jù)結(jié)果。
下面采用某商店的零售數(shù)據(jù)集,通過實際的應(yīng)用場景,來介紹一下style
中那些實用的方法。
首先導(dǎo)入相應(yīng)的包和數(shù)據(jù)集
import pandas as pd
import numpy as np
data = data = pd.read_excel('./data/sales.xlsx')
data.head()
數(shù)據(jù)集中的特征有訂單號、顧客姓名、商品名、數(shù)量、單價、金額以及對應(yīng)的購買日期。
輸出格式化
style
中的format
函數(shù)可以對輸出進(jìn)行格式化,比如在上述的數(shù)據(jù)集中,求每位顧客的消費平均金額和總金額,要求保留兩位小數(shù)并顯示相應(yīng)的幣種。
(data.groupby(['姓名'])['金額'].agg(['mean','sum'])
.head(5)
.style
.format('${0:,.2f}'))
又或求每位顧客的總消費金額(保留2位小數(shù))及其對應(yīng)的占比情況(以百分?jǐn)?shù)形式展現(xiàn))
consumer_sales = data.groupby('姓名')['金額'].agg(['sum']).reset_index()
consumer_sales['消費金額占比'] = consumer_sales['sum'] / consumer_sales['sum'].sum()
(consumer_sales.head(5)
.style
.format({'sum':'${0:,.0f}', '消費金額占比': '{:.2%}'}))
突出顯示特殊值
style
還可以突出顯示數(shù)據(jù)中的特殊值,比如高亮顯示數(shù)據(jù)中的最大(highlight_max
)、最小值(highlight_min
)。
#求每個月的銷售總金額,并分別用紅色、綠色高亮顯示最大值和最小值
monthly_sales = data.resample('M',on='日期')['金額'].agg(['sum']).reset_index()
monthly_sales['pct_of_total'] = monthly_sales['sum'] / data['金額'].sum()
format_dict = {'sum':'${0:,.0f}', '日期': '{:%Y-%m}', 'pct_of_total': '{:.2%}'}
(monthly_sales.style
.format(format_dict)
.highlight_max(color='#cd4f39')
.highlight_min(color='lightgreen'))
色階樣式
運用style
的background_gradient
方法,還可以實現(xiàn)類似于Excel的條件格式中的顯示色階樣式,用顏色深淺來直觀表示數(shù)據(jù)大小。
import seaborn as sns
cm = sns.light_palette('green', as_cmap=True)
(data.groupby(['姓名'])[['數(shù)量','金額']]
.agg(['sum'])
.head(5)
.style
.background_gradient(cmap=cm))
數(shù)據(jù)條樣式
同樣的,對于Excel的條件格式中的數(shù)據(jù)條樣式,可以用style
中的bar
達(dá)到類似效果,通過顏色條的長短可以直觀顯示數(shù)值的大小。
(monthly_sales.style
.format(format_dict)
.bar(color='#FFA07A', vmin=100_000, subset=['sum'], align='zero')
.bar(color='lightgreen', vmin=0, subset=['pct_of_total'], align='zero')
)
迷你圖
最后介紹一個簡單好用的騷操作——sparklines
的運用,它能夠以字符串的形式展現(xiàn)一個迷你的數(shù)據(jù)特征圖。
假設(shè)我現(xiàn)在有一個這樣的需求,就是想看看所有用戶的購買數(shù)量和金額的大體分布情況。
按照往常的思路,可以用可視化的形式繪制出來,但是這樣稍顯復(fù)雜,使用sparklines
則可以簡單達(dá)到這種效果。
首先需要安裝sparklines
這個包
pip install sparklines
因為需求的實現(xiàn)需要用的groupby
函數(shù),所以先定義一個處理函數(shù)
from sparklines import sparklines
# 定義sparklines函數(shù)用于展現(xiàn)數(shù)據(jù)分布
def sparkline_str(x):
bins = np.histogram(x)[0]
sl = ''.join(sparklines(bins))
return sl
# 定義groupby之后的列名
sparkline_str.__name__ = '分布圖'
data.groupby('姓名')[['數(shù)量', '金額']].agg(['mean', sparkline_str])
這樣一來,就比較清晰直觀地展現(xiàn)了每個用戶的消費數(shù)量分布和消費金額分布,進(jìn)而可以根據(jù)這些特征對用戶的消費行為進(jìn)行進(jìn)一步的研究。
sparklines
的功能還是挺Cool挺實用的,更具體的用法可以去看看sparklines
的文檔。