1. 程式人生 > >小白學 Python 資料分析(12):Pandas (十一)資料透視表(pivot_table)

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

![](https://cdn.geekdigging.com/python/spider-blog/Python_logo.jpg) > 人生苦短,我用 Python 前文傳送門: [小白學 Python 資料分析(1):資料分析基礎](https://www.geekdigging.com/2020/01/19/6719980708/) [小白學 Python 資料分析(2):Pandas (一)概述](https://www.geekdigging.com/2020/01/20/6718497214/) [小白學 Python 資料分析(3):Pandas (二)資料結構 Series](https://www.geekdigging.com/2020/02/04/3234667780/) [小白學 Python 資料分析(4):Pandas (三)資料結構 DataFrame](https://www.geekdigging.com/2020/02/05/9920298470/) [小白學 Python 資料分析(5):Pandas (四)基礎操作(1)檢視資料](https://www.geekdigging.com/2020/02/16/6852411690/) [小白學 Python 資料分析(6):Pandas (五)基礎操作(2)資料選擇](https://www.geekdigging.com/2020/02/20/6566891797/) [小白學 Python 資料分析(7):Pandas (六)資料匯入](https://www.geekdigging.com/2020/02/23/7355903936/) [小白學 Python 資料分析(8):Pandas (七)資料預處理](https://www.geekdigging.com/2020/02/25/9013297409/) [小白學 Python 資料分析(9):Pandas (八)資料預處理(2)](https://www.geekdigging.com/2020/02/27/2857868620/) [小白學 Python 資料分析(10):Pandas (九)資料運算](https://www.geekdigging.com/2020/02/29/5808964196/) [小白學 Python 資料分析(11):Pandas (十)資料分組](https://www.geekdigging.com/2020/03/03/5975552137/) ## 引言 前文我們介紹了資料分組,今天我們接著介紹一個和資料分組很相似的內容,是資料透視表,從名字上來看是不是感覺沒半毛錢關係,實際不然,資料分組是從一維(行)的角度上對資料進行了拆分,如果我們想從二維的角度上(行和列)同時對資料進行拆分呢? 這就需要用到我們今天的主角,資料透視表了。 ## 資料透視表 什麼是資料透視表?小編的靈魂畫手上線: ![](https://cdn.geekdigging.com/data_analysis/pandas/shujutoushibiao.png) 圖畫的不好,各位同學湊合理解。 在 Excel 中,其實也有資料透視表這個東西,在插入中全選資料後點擊資料透視表,就會出來這麼個東西: ![](https://cdn.geekdigging.com/data_analysis/pandas/shujutoushibiao-1.png) 點選確定後會有這麼個畫面: ![](https://cdn.geekdigging.com/data_analysis/pandas/shujutoushibiao-2.png) 具體在 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: 合計類的列名 下面我們來看示例,資料集還是使用上篇文章使用的疫情資料集,先看個簡單的示例,我們按照七大洲,看下當前的確診情況: ```python 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` 是我們對需要統計的值的統計方式。 這裡只是按照一維的方式進行拆分,和分組並沒有實際上的區別,接下來我們看從二維的方向上對資料進行拆分: ```python 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` : ```python 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](https://github.com/meteor1993/python-learning/tree/master/python-data-analysis/pandas-demo "示例程式碼-Github") [示例程式碼-Gitee](https://gitee.com/inwsy/python-learning/tree/master/python-data-analysis/pandas-demo "示例程式碼