Python中pandas透視表pivot_table功能詳解
一文看懂pandas的透視表pivot_table
一奸例、概述
1.1 什么是透視表穆趴?
透視表是一種可以對(duì)數(shù)據(jù)動(dòng)態(tài)排布并且分類匯總的表格格式虑粥」Ы穑或許大多數(shù)人都在Excel使用過數(shù)據(jù)透視表项贺,也體會(huì)到它的強(qiáng)大功能鳞仙,而在pandas中它被稱作pivot_table寇蚊。
1.2 為什么要使用pivot_table?
- 靈活性高棍好,可以隨意定制你的分析計(jì)算要求
- 脈絡(luò)清晰易于理解數(shù)據(jù)
- 操作性強(qiáng)仗岸,報(bào)表神器
二、如何使用pivot_table
首先讀取數(shù)據(jù)借笙,數(shù)據(jù)集是火箭隊(duì)當(dāng)家球星James Harden某一賽季比賽數(shù)據(jù)作為數(shù)據(jù)集進(jìn)行講解爹梁。
對(duì)手,勝負(fù),主客場(chǎng),命中,投籃數(shù),投籃命中率,3分命中率,籃板,助攻,得分
勇士,勝,客,10,23,0.435,0.444,6,11,27
國王,勝,客,8,21,0.381,0.286,3,9,27
小牛,勝,主,10,19,0.526,0.462,3,7,29
灰熊,負(fù),主,8,20,0.4,0.25,5,8,22
76人,勝,客,10,20,0.5,0.25,3,13,27
黃蜂,勝,客,8,18,0.444,0.4,10,11,27
灰熊,負(fù),客,6,19,0.316,0.222,4,8,20
76人,負(fù),主,8,21,0.381,0.429,4,7,29
尼克斯,勝,客,9,23,0.391,0.353,5,9,31
老鷹,勝,客,8,15,0.533,0.545,3,11,29
爵士,勝,主,19,25,0.76,0.875,2,13,56
騎士,勝,主,8,21,0.381,0.429,11,13,35
灰熊,勝,主,11,25,0.44,0.429,4,8,38
步行者,勝,客,9,21,0.429,0.25,5,15,26
猛龍,負(fù),主,8,25,0.32,0.273,6,11,38
太陽,勝,客,12,22,0.545,0.545,2,7,48
灰熊,勝,客,9,20,0.45,0.5,5,7,29
掘金,勝,主,6,16,0.375,0.143,8,9,21
尼克斯,勝,主,12,27,0.444,0.385,2,10,37
籃網(wǎng),勝,主,13,20,0.65,0.615,10,8,37
步行者,勝,主,8,22,0.364,0.333,8,10,29
湖人,勝,客,13,22,0.591,0.444,4,9,36
爵士,勝,客,8,19,0.421,0.333,5,3,29
開拓者,勝,客,16,29,0.552,0.571,8,3,48
鵜鶘,勝,主,8,16,0.5,0.4,1,17,26
下官方文檔中pivot_table的函數(shù)體:pandas.pivot_table - pandas 0.21.0 documentation
pivot_table(data, values=None, index=None, columns=None,aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
pivot_table有四個(gè)最重要的參數(shù)index
、values
提澎、columns
姚垃、aggfunc
,本文以這四個(gè)參數(shù)為中心講解pivot操作是如何進(jìn)行盼忌。
2.1 讀取數(shù)據(jù)
import pandas as pd
import numpy as np
df = pd.read_csv('James_Harden.csv',encoding='utf8')
df
數(shù)據(jù)格式如下:
2.2 Index
每個(gè)pivot_table必須擁有一個(gè)index
积糯,如果想查看james harden對(duì)陣每個(gè)隊(duì)伍的得分,首先我們將對(duì)手設(shè)置為index
:
pd.pivot_table(df,index=[u'對(duì)手'])
對(duì)手成為了第一層索引谦纱,還想看看對(duì)陣同一對(duì)手在不同主客場(chǎng)下的數(shù)據(jù)看成,試著將對(duì)手與勝負(fù)與主客場(chǎng)都設(shè)置為index
,其實(shí)就變成為了兩層索引
pd.pivot_table(df,index=[u'對(duì)手',u'主客場(chǎng)'])
試著交換下它們的順序跨嘉,數(shù)據(jù)結(jié)果一樣:
pd.pivot_table(df,index=[u'主客場(chǎng)',u'對(duì)手'])
看完上面幾個(gè)操作川慌,Index
就是層次字段,要通過透視表獲取什么信息就按照相應(yīng)的順序設(shè)置字段祠乃,所以在進(jìn)行pivot之前你也需要足夠了解你的數(shù)據(jù)梦重。
2.3 Values
通過上面的操作,我們獲取了james harden在對(duì)陣對(duì)手時(shí)的所有數(shù)據(jù)亮瓷,而Values
可以對(duì)需要的計(jì)算數(shù)據(jù)進(jìn)行篩選琴拧,如果我們只需要james harden在主客場(chǎng)和不同勝負(fù)情況下的得分、籃板與助攻三項(xiàng)數(shù)據(jù):
pd.pivot_table(df,index=[u'主客場(chǎng)',u'勝負(fù)'],values=[u'得分',u'助攻',u'籃板'])
2.4 Aggfunc
aggfunc
參數(shù)可以設(shè)置我們對(duì)數(shù)據(jù)聚合時(shí)進(jìn)行的函數(shù)操作嘱支。
當(dāng)我們未設(shè)置aggfunc
時(shí)蚓胸,它默認(rèn)aggfunc='mean'
計(jì)算均值。我們還想要獲得james harden在主客場(chǎng)和不同勝負(fù)情況下的總得分除师、總籃板沛膳、總助攻時(shí):
pd.pivot_table(df,index=[u'主客場(chǎng)',u'勝負(fù)'],values=[u'得分',u'助攻',u'籃板'],aggfunc=[np.sum,np.mean])
2.5 Columns
Columns類似Index
可以設(shè)置列層次字段,它不是一個(gè)必要參數(shù)汛聚,作為一種分割數(shù)據(jù)的可選方式锹安。
fill_value
填充空值,margins=True
進(jìn)行匯總
pd.pivot_table(df,index=[u'主客場(chǎng)'],columns=[u'對(duì)手'],values=[u'得分'],aggfunc=[np.sum],fill_value=0,margins=1)
現(xiàn)在我們已經(jīng)把關(guān)鍵參數(shù)都介紹了一遍,下面是一個(gè)綜合的例子:
table=pd.pivot_table(df,index=[u'對(duì)手',u'勝負(fù)'],columns=[u'主客場(chǎng)'],values=[u'得分',u'助攻',u'籃板'],aggfunc=[np.mean],fill_value=0)
結(jié)果如下:
aggfunc
也可以使用dict
類型,如果dict
中的內(nèi)容與values
不匹配時(shí)八毯,以dic
t中為準(zhǔn)搓侄。
table=pd.pivot_table(df,index=[u'對(duì)手',u'勝負(fù)'],columns=[u'主客場(chǎng)'],values=[u'得分',u'助攻',u'籃板'],aggfunc={u'得分':np.mean, u'助攻':[min, max, np.mean]},fill_value=0)
結(jié)果就是助攻求min
,max
和mean
,得分求mean
,而籃板沒有顯示瞄桨。