人生苦短,我用 Pythonhtml
前文傳送門:python
小白學 Python 數據分析(2):Pandas (一)概述github
小白學 Python 數據分析(3):Pandas (二)數據結構 Seriesapi
小白學 Python 數據分析(4):Pandas (三)數據結構 DataFrame數組
小白學 Python 數據分析(5):Pandas (四)基礎操做(1)查看數據數據結構
小白學 Python 數據分析(6):Pandas (五)基礎操做(2)數據選擇ide
小白學 Python 數據分析(7):Pandas (六)數據導入spa
小白學 Python 數據分析(8):Pandas (七)數據預處理excel
小白學 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'
下面咱們來看示例,數據集仍是使用上篇文章使用的疫情數據集,先看個簡單的示例,咱們按照七大洲,看下當前的確診狀況:
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 上,方便你們取用。