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

人生苦短,我用 Python

前文傳送門:html

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

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

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

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

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

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

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

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

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

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

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

引言

前文咱們介紹了數據分組,今天咱們接着介紹一個和數據分組很類似的內容,是數據透視表,從名字上來看是否是感受沒半毛錢關係,實際否則,數據分組是從一維(行)的角度上對數據進行了拆分,若是咱們想從二維的角度上(行和列)同時對數據進行拆分呢?

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

數據透視表

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

圖畫的很差,各位同窗湊合理解。

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

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

具體在 Excel 中如何使用各位同窗能夠百度查一下,畢竟這裏是講 Python 的地方,關於 Excel 的操做就很少說了,Pandas 的操做和 Excel 的使用仍是比較類似的。

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

官方文檔地址: https://pandas.pydata.org/pan...

再看下 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

若是個人文章對您有幫助,請掃碼關注下做者的公衆號:獲取最新干貨推送:)

相關文章
相關標籤/搜索