使用Pandas DataFrame輸出報告

2022-01-07 磐創AI

作者 | 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對象支持連結樣式函數。讓我們看看另一個更複雜的例子。

比方說,我們想在原始數據框中添加以下樣式。

是的,我們可以通過使用鍊表達式一次性完成所有這些操作。

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

相關焦點

  • python:數據結構之dataframe
    Dataframe1、什麼是dataframe對象DataFrame是pandas庫中最常用的數據類型,是一種存放數據的容器,dataframe
  • Python Pandas 最詳教程
    pandas 最有趣的地方在於裡面隱藏了很多包。它是一個核心包,裡面有很多其他包的功能。這點很棒,因為你只需要使用 pandas 就可以完成工作。pandas 相當於 python 中 excel:它使用表(也就是 dataframe),能在數據上做各種變換,但還有其他很多功能。如果你早已熟知 python 的使用,可以直接跳到第三段。
  • Pandas 常用功能詳細教程!
    pandas 最有趣的地方在於裡面隱藏了很多包。它是一個核心包,裡面有很多其他包的功能。這點很棒,因為你只需要使用 pandas 就可以完成工作。pandas 相當於 python 中 excel:它使用表(也就是 dataframe),能在數據上做各種變換,但還有其他很多功能。
  • Python基礎 | pandas.dataframe 專題使用指南
    dataframe的單列或單行如上,此時返回的是一個series,而不是dataframe。若要返回dataframe,可用中括號把索引括上,如下。data=None, index=None, columns=None)data= 數據index= 索引,即行名、行表頭columns= 列名、列表頭使用前要執行前面的import pandas as pd
  • 別找了,這是 pandas 最詳細教程了
    pandas 最有趣的地方在於裡面隱藏了很多包。它是一個核心包,裡面有很多其他包的功能。這點很棒,因為你只需要使用 pandas 就可以完成工作。pandas 相當於 python 中 excel:它使用表(也就是 dataframe),能在數據上做各種變換,但還有其他很多功能。
  • 別找了,這是 Pandas 最詳細教程了
    pandas 最有趣的地方在於裡面隱藏了很多包。它是一個核心包,裡面有很多其他包的功能。這點很棒,因為你只需要使用 pandas 就可以完成工作。pandas 相當於 python 中 excel:它使用表(也就是 dataframe),能在數據上做各種變換,但還有其他很多功能。
  • 整理一套 pandas 詳細教程,希望對你有幫助!
    pandas 最有趣的地方在於裡面隱藏了很多包。它是一個核心包,裡面有很多其他包的功能。這點很棒,因為你只需要使用 pandas 就可以完成工作。pandas 相當於 python 中 excel:它使用表(也就是 dataframe),能在數據上做各種變換,但還有其他很多功能。如果你早已熟知 python 的使用,可以直接跳到第三段。
  • PandaSQL:一個讓你能夠通過SQL語句進行pandas的操作的python包
    如果你熟練的使用SQL,那麼這篇文章將介紹一種更直接、簡單的使用Pandas處理大多數數據操作案例。假設你對SQL非常的熟悉,或者你想有更可讀的代碼。或者您只是想在dataframe上運行一個特殊的SQL查詢。或者,也許你來自R,想要一個sqldf的替代品。
  • Pandas知識點-DataFrame數據結構介紹
    此外,Pandas對numpy和matplotlib的一些方法進行了更高層的封裝和擴展,使用起來更方便和快捷,功能也更加強大。pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple從本文開始,我會用多篇文章來介紹Pandas的知識點。
  • 快速解釋如何使用pandas的inplace參數
    介紹在操作dataframe時,初學者有時甚至是更高級的數據科學家會對如何在pandas中使用inplace參數感到困惑。更有趣的是,我看到的解釋這個概念的文章或教程並不多。它似乎被假定為知識或自我解釋的概念。
  • 如何使用 Python 繪製 COVID-19 的全球擴散圖
    下面是用於處理 COVID-19 數據的一些常見的情況: 從 GitHub 上下載 COVID-19 的國家每日傳播數據,保存為一個 Pandas 中的 DataFrame 對象。這時你需要使用 Python 中的 Pandas 庫。 處理並清理下載好的數據,使其滿足可視化數據的輸入格式。所下載的數據的情況很好(數據規整)。
  • 取dataframe第一列 - CSDN
    我剛剛導入了excel文件的數據,並希望通過以下方法獲得名稱數據(第一列)data['Name']​KeyError Traceback (most recent call last) in ()----> 1 school_names = processing['Name']/Users/test/anaconda/lib/python3.6/site-packages/pandas/core/frame.py
  • 數據太多而無法使用?快試試這個Kaggle大數據集高效訪問教程
    Answer Correctness Prediction數據集由10列,超1億行的數據組成,在Kaggle Notebook中使用pd.read_csv方法讀取會導致內存不足,因此本文將該數據集做為典型示例。