小白學 Python 數據分析(12):Pandas (十一)數據透視表(pivot_table)

人生苦短,我用 Python

前文傳送門:

小白學 Python 數據分析(1):數據分析基礎

小白學 Python 數據分析(2):Pandas (一)概述

小白學 Python 數據分析(3):Pandas (二)數據結構 Series

小白學 Python 數據分析(4):Pandas (三)數據結構 DataFrame

小白學 Python 數據分析(5):Pandas (四)基礎操作(1)查看數據

小白學 Python 數據分析(6):Pandas (五)基礎操作(2)數據選擇

小白學 Python 數據分析(7):Pandas (六)數據導入

小白學 Python 數據分析(8):Pandas (七)數據預處理

小白學 Python 數據分析(9):Pandas (八)數據預處理(2)

小白學 Python 數據分析(10):Pandas (九)數據運算

小白學 Python 數據分析(11):Pandas (十)數據分組

引言

前文我們介紹了數據分組,今天我們接著介紹一個和數據分組很相似的內容,是數據透視表,從名字上來看是不是感覺沒半毛錢關係,實際不然,數據分組是從一維(行)的角度上對數據進行了拆分,如果我們想從二維的角度上(行和列)同時對數據進行拆分呢?

這就需要用到我們今天的主角,數據透視表了。

數據透視表

什麼是數據透視表?小編的靈魂畫手上線:

圖畫的不好,各位同學湊合理解。

在 Excel 中,其實也有數據透視表這個東西,在插入中全選數據後點擊數據透視表,就會出來這麼個東西:

點擊確定後會有這麼個畫面:

具體在 Excel 中如何使用各位同學可以百度查一下,畢竟這裡是講 Python 的地方,關於 Excel 的操作就不多說了,Pandas 的操作和 Excel 的使用還是比較相似的。

在 Pandas 中,實現數據透視表是使用的 pivot_table() 這個方法,首先還是放個官方文檔,防止有同學找不到。

官方文檔地址: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html

再看下 pivot_table 的語法:

pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False) → 'DataFrame'

  • data: 需要做數據透視的整個表
  • values: 要匯總的數據項
  • index: 在數據透視表索引上進行分組的鍵
  • columns: 在數據透視表列上進行分組的鍵
  • aggfunc: 對 values 的計算類型
  • fill_value: 空值的填充值
  • margins: 是否顯示合計
  • dropna: 是否刪除缺失,如果未是,則刪除缺失數據的那一行
  • margins_name: 合計類的列名

下面我們來看示例,數據集還是使用上篇文章使用的疫情數據集,先看個簡單的示例,我們按照七大洲,看下當前的確診情況:

import pandas as pd    # 數據導入  epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")    df = pd.pivot_table(epidemic_dxy, values='currentConfirmedCount', index='continents', aggfunc='sum')    print(df)    # 輸出內容              currentConfirmedCount  continents  亞洲                           5458  其他                            699  北美洲                            99  南美洲                             8  大洋洲                            14  歐洲                           2040  非洲                              3

可以看到,和我們前面的文章中,按照七大洲直接分組的結果是一致的。

這個示例中的 currentConfirmedCount 是我們要統計的值, continents 是我們要拆分的索引, aggfunc 中的 sum 是我們對需要統計的值的統計方式。

這裡只是按照一維的方式進行拆分,和分組並沒有實際上的區別,接下來我們看從二維的方向上對數據進行拆分:

import pandas as pd    # 數據導入  epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")    df1 = pd.pivot_table(epidemic_dxy, values='currentConfirmedCount', index='continents', columns='provinceName', aggfunc='sum')    print(df1)    # 輸出內容  provinceName   丹麥  亞美尼亞  以色列   伊拉克     伊朗  ...   阿曼   阿聯酋      韓國  馬來西亞  黎巴嫩  continents                                 ...  亞洲            NaN   1.0  9.0  19.0  749.0  ...  5.0  16.0  4283.0  11.0  3.0  其他            NaN   NaN  NaN   NaN    NaN  ...  NaN   NaN     NaN   NaN  NaN  北美洲           NaN   NaN  NaN   NaN    NaN  ...  NaN   NaN     NaN   NaN  NaN  南美洲           NaN   NaN  NaN   NaN    NaN  ...  NaN   NaN     NaN   NaN  NaN  大洋洲           NaN   NaN  NaN   NaN    NaN  ...  NaN   NaN     NaN   NaN  NaN  歐洲            3.0   NaN  NaN   NaN    NaN  ...  NaN   NaN     NaN   NaN  NaN  非洲            NaN   NaN  NaN   NaN    NaN  ...  NaN   NaN     NaN   NaN  NaN    [7 rows x 65 columns]

因為內容比較多,大部分的內容被摺疊掉了。

在上面這個示例中,我們按照七大洲和國家對整個數據表進行了橫縱向的拆分,可以看到,整個表中會有很多空值,拿亞洲那一行舉例子,因為在我們的原始數據中只有亞洲只有 26 個國家,所以,理論上亞洲那一行應該只有那 26 個國家有數據,實際上也確實如此。

那麼,現在有一個簡單的小問題,如果我想要知道每條數據的創建時間( createTime 欄位),這個也能行么?

當然可以, pivot_table 支援在橫縱向拆分的時候傳入一個數組的,如下,我們在 index 上再加一個新的參數 createTime

import pandas as pd    # 數據導入  epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")    df2 = pd.pivot_table(epidemic_dxy, values='currentConfirmedCount', index=['continents', 'createTime'], columns='provinceName', aggfunc='sum')    print(df2)    # 輸出內容  provinceName               丹麥  亞美尼亞  以色列   伊拉克  ...   阿聯酋      韓國  馬來西亞  黎巴嫩  continents createTime                           ...  亞洲         1583138990000  NaN   NaN  9.0  19.0  ...  16.0  4283.0  11.0  3.0             1583138991000  NaN   1.0  NaN   NaN  ...   NaN     NaN   NaN  NaN  其他         1583138990000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN  北美洲        1583138990000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN             1583138991000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN  南美洲        1583138990000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN             1583138991000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN  大洋洲        1583138990000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN  歐洲         1583138990000  3.0   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN             1583138991000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN  非洲         1583138990000  NaN   NaN  NaN   NaN  ...   NaN     NaN   NaN  NaN    [11 rows x 65 columns]

這樣,我們就得到了一個新的按照三個規則分別進行橫縱向拆分的 DataFrame ,當然,這個 DataFrame 目前並不是一個標準的 DataFrame ,只需要最後一步,使用 reset_index() 重置一下索引就可以了,這裡小編就不演示了。

今天的內容比較短,但是對於第一次接觸的同學來講並不是很好理解,建議多動手找個數據集試試看,或者先在 Excel 中進行嘗試後再使用 Python 進行理解。

在數據透視表中,獲得數據透視表並不難,難點是在於我們想要構建怎麼樣的新的數據表,我們要真正要獲取什麼樣的數據。

示例程式碼

老規矩,所有的示例程式碼都會上傳至程式碼管理倉庫 Github 和 Gitee 上,方便大家取用。

示例程式碼-Github

示例程式碼-Gitee