使用Pandas DataFrame輸出報告
作者|Christopher Tao 編譯|VK 來源|Towards Datas Science
作為一個使用Python作為主要程式語言的資料科學家或分析師,我相信你一定經常使用Pandas。在Jupyter Notebook上輸出pandas DataFrame是非常頻繁的。
然而,你有沒有想過,我們可以讓DataFrame本身視覺化?換句話說,對於一些簡單的視覺化目的,我們不需要Matplotlib或其他視覺化庫。
Pandas DataFrame輸出可以像Excel電子表格一樣視覺化,並且支援複雜樣式,程式碼非常簡單。
在這篇文章中,我將介紹Pandas庫中的樣式包,與它的資料處理方法相比,知道它的人相對較少。此外,還有一些有趣的庫,它們支援Pandas DataFrame的更多線上視覺化。在最後一節中,我還將介紹其中的一個Sparklines。
關於Pandas庫
眾所周知,Pandas DataFrame可以輸出到iPython/Jupyter Notebook中,該 Notebook自動以HTML格式呈現CSS樣式。這絕對是一個驚人的功能,因為即使我們只是簡單地列印它,簡報也非常漂亮。
它使用“HTML+CSS”。Pandas還允許我們定製CSS樣式,使它看起來更漂亮。這是通過“style”API實現的。
https://pandas.pydata.org/docs/reference/style.html
我們可以直接呼叫df.style獲取 DataFrame的Styler物件,然後新增所需的樣式。現在,讓我們看看我們能做些什麼。
格式化輸出
當然,我們總是可以格式化資料本身,比df.round(2))將所有數值四捨五入到2位小數。然而,使用Pandas style也有一些好處。例如,我們實際上不更改值,而只更改表示形式,這樣就不會丟失精度。
讓我們先建立一個隨機DataFrame。
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(10, 2)*100)
然後,讓我們以特定格式輸出 DataFrame。
df.style.format("{:.2f}")
順便說一句,如果你不太熟悉Python格式化語言,例如表示式{:.2f},那麼你可以在這裡檢視官方文件):https://docs.python.org/3/library/string.html#formatspec
用背景和文字顏色突出顯示單元格
我知道,格式化還不夠酷。有了CSS,我們可以輕鬆地做很多事情,比如改變背景顏色和文字顏色。
例如,對於上面顯示的同一個 DataFrame,我們希望分別突出顯示正數和自然數。如果你對CSS有一些基本的瞭解,或者只是簡單的Google一下,你就會知道下面的屬性來設定HTML表格單元格的背景顏色和文字顏色。
background-color: red; color: white
讓我們編寫一個函式來給表格單元格著色。
def highlight_number(row):
return [
'background-color: red; color: white' if cell <= 0
else 'background-color: green; color: white'
for cell in row
]
如果單元格的值為負數,我們使用紅色作為背景,否則如果是正值,則使用綠色。由於顏色可能有點暗,我們還想將文字顏色改為白色。
然後,我們可以將函式應用於 DataFrame。
df.style.apply(highlight_number)
超級酷!現在很明顯,我們得到了負數和正數,它們很好地區分開來。
連結樣式函式
到目前為止,我們每次只新增一種樣式。事實上,我們呼叫df.style,返回 DataFrame的Styler物件。Styler物件支援連結樣式函式。讓我們看看另一個更復雜的例子。
比方說,我們想在原始資料框中新增以下樣式。
用紅色突出顯示負數,用綠色突出顯示正數。
格式化數字。
使用set_caption()向表新增標題。
使表格間隙變大,這樣看起來就不會那麼擠了。
在單元格之間新增白色邊框以改善顯示效果。
是的,我們可以通過使用連結串列達式一次性完成所有這些操作。
df.style \
.apply(highlight_number) \
.format('${0:,.2f}') \
.set_caption('A Sample Table') \
.set_properties(padding="20px", border='2px solid white')
感覺該表可以直接用於某些業務報表
內建突出顯示功能
不懂CSS,但還是想炫耀一下?是的,Pandas風格還提供了一些內建的函式,這些函式很酷,但很容易使用。
突出顯示函式
讓我們使用相同的 DataFrame進行演示。
# 為演示目的生成一個nan值
df.at[1, 1] = None
# 新增樣式
df.style \
.highlight_null('lightgray') \
.highlight_max(color='lightgreen') \
.highlight_min(color='pink')
看,用你喜歡的顏色來突出顯示空值、最小值和最大值是很容易的。我建議使用淺色,因為文字顏色總是黑色的。
漸變色背景
Pandas風格還支援使用cmap為表格背景著色。當我們想將數值資料視覺化時,這是非常有用的。
df = pd.DataFrame(np.random.randn(10, 2))
df.style \
.background_gradient(cmap='Blues')
所以,背景色是漸變色的取決於數值。請注意,“藍調”是Pandas支援的cmap之一。如果你想知道其他支援什麼,那麼下面的Matplotlib文件頁是一個很好的參考。
https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html#sequential
折線條形圖
這是另一個內建的超級酷的函式。它可以在每個單元格的背景中生成條形圖,以指示它們的值。讓我們使用上面的 DataFrame。
df.style.bar()
當然,我們對條形圖的預設樣式並不滿意。讓我們改進一下演示。
df.style \
.format('{:.2f}') \
.bar(align='mid', color=['#FCC0CB', '#90EE90']) \
.set_caption('A Sample Table with Bar Chart') \
.set_properties(padding="15px", border='2px solid white', width='300px')
你能相信這仍然是你熟悉的“Pandas DataFrame"嗎?
讓我簡單地解釋一下bar()方法中的引數。color引數支援單個字串或元組,當它是元組時,第一種顏色將用於為負值著色,第二種顏色用於為正值著色。因為我們使用兩種顏色,所以我們需要將條形圖設定為在單元格中間對齊。
Sparklines-一個直線柱狀圖
我可以到此為止,但我想展示我發現的另一個非常有趣的庫,叫做Sparklines。
你可以使用pip安裝庫。
pip install sparklines
然後,讓我們匯入這個庫並建立另一個示例 DataFrame以供演示。
from sparklines import sparklines
df = pd.DataFrame({
'a': np.random.normal(0, 1, 100),
'b': np.random.normal(1, 1, 100),
'c': np.random.normal(0, 3, 100)
})
Sparklines的功能很簡單。它可以使用Unicode字串生成條形圖,例如▁、▂、▃。為了確保條形圖的順序正確,並使其成為一個柱狀圖,我們需要先使用NumPy來準備值來生成直方圖值。
def sparkline_dist(data):
hist = np.histogram(data, bins=10)[0]
dist_strings = ''.join(sparklines(hist))
return dist_strings
對於每一列,我們可以使用迷你圖生成直方圖。
[sparkline_dist(df[col]) for col in df.columns]
最後,我們可以將字串與其他統計資料放在一起,以生成更好的報告。
df_stats = df.agg(['mean', 'std']).transpose()
df_stats['histogram'] = sl_list
df_stats.style \
.format('{:.2f}', subset=['mean', 'std']) \
.set_caption('A Sample Table with Sparklines Distributions') \
.set_properties(padding="15px", border='2px solid white')
總結
在本文中,我向你演示了Pandas樣式包中的所有主要方法。我們可以設定值的格式,給背景著色,用定製的CSS屬性來改進演示。
原文連結:https://towardsdatascience.com/make-your-pandas-dataframe-output-report-ready-a9440f6045c6
歡迎關注磐創AI部落格站: http://panchuang.net/
sklearn機器學習中文官方文件: http://sklearn123.com/
歡迎關注磐創部落格資源彙總站: http://docs.panchuang.net/
相關文章
- Pandas - DataFrame.loc
- Pandas DataFrame常用方法
- 【pandas學習筆記】DataFrame筆記
- Pandas 基礎 (2) - Dataframe 基礎
- pandas中dataframe與dict相互轉換
- pandas.DataFrame.groupby函式應用函式
- python pandas DataFrame-A 更新 DataFrame-B中指定列相同的資料Python
- Pandas使用DataFrame進行資料分析比賽進階之路(一)
- pandas -- DataFrame的級聯以及合併操作
- pandas | DataFrame中的排序與彙總方法排序
- pandas dataframe 時間欄位 diff 函式函式
- Pandas高階教程之:Dataframe的合併
- Pandas 基礎 (8) - 用 concat 組合 dataframe
- jmeter+ant輸出測試報告JMeter測試報告
- pandas | 詳解DataFrame中的apply與applymap方法APP
- pandas 實現兩個dataframe相減的方式
- 44 pandas DataFrame分層索引切片選擇(tcy)索引
- Python, pandas: how to sort dataframe by index// Merge two dataframes by indexPythonIndex
- Pandas 基礎 (3) - 生成 Dataframe 的幾種方式
- python中pandas.Dataframe合併的方法有哪些?Python
- Pandas高階教程之:Dataframe的重排和旋轉
- Python的pandas的Dataframe使用groupby分組並求每組的統計值Python
- 使用Pandas IO工具流式傳輸源資料
- Python中4種方法實現列印整個Pandas DataFramePython
- DataFrame概述與使用
- fscan內網資產掃描並輸出報告內網
- python-資料分析-Pandas-3、DataFrame-資料重塑Python
- 31_Pandas.DataFrame,Series和NumPy陣列ndarray相互轉換陣列
- 用docxtpl庫實現docx報告自動化輸出
- python-資料分析-Pandas-4、DataFrame-資料透視Python
- 用Pandas讀寫Excel檔案-輸出單sheet和多sheetExcel
- pandas使用
- 使用ofstream輸出unicodeUnicode
- python遠端連線mysql以及pandas.DataFrame.to_sql寫入資料庫PythonMySql資料庫
- pandas merge報錯
- panda.DataFrame.loc 使用詳解
- 基於python的大資料分析實戰學習筆記-pandas之DataFramePython大資料筆記
- pandas.DataFrame讀取特定的列並刪除某列空值所在的行