1. 程式人生 > 其它 >Python中pandas透視表pivot_table功能詳解(非常簡單易懂)

Python中pandas透視表pivot_table功能詳解(非常簡單易懂)

一、概述

1.1 什麼是透視表?

透視表是一種可以對資料動態排布並且分類彙總的表格格式。或許大多數人都在Excel使用過資料透視表,也體會到它的強大功能,而在pandas中它被稱作pivot_table。

1.2 為什麼要使用pivot_table?

  • 靈活性高,可以隨意定製你的分析計算要求
  • 脈絡清晰易於理解資料
  • 操作性強,報表神器

二、如何使用pivot_table

首先讀取資料,資料集是火箭隊當家球星James Harden某一賽季比賽資料作為資料集進行講解。資料地址

先看一下官方文件中pivot_table的函式體: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有四個最重要的引數index、values、columns、aggfunc,本文以這四個引數為中心講解pivot操作是如何進行。

2.1 讀取資料

  1. import pandasas pd
  2. import numpyas np
  3. df = pd.read_csv('h:/James_Harden.csv',encoding='utf8')
  4. df.tail()

資料格式如下:

2.2Index

每個pivot_table必須擁有一個index,如果想檢視哈登對陣每個隊伍的得分,首先我們將對手設定為index

pd.pivot_table(df,index=[u'對手'])

對手成為了第一層索引,還想看看對陣同一對手在不同主客場下的資料,試著將對手與勝負與主客場都設定為index,其實就變成為了兩層索引

pd.pivot_table(df,index=[u'對手',u'主客場'])

試著交換下它們的順序,資料結果一樣:

pd.pivot_table(df,index=[u'主客場',u'對手'])

看完上面幾個操作,Index就是層次欄位,要通過透視表獲取什麼資訊就按照相應的順序設定欄位

,所以在進行pivot之前你也需要足夠了解你的資料。

2.3Values

通過上面的操作,我們獲取了james harden在對陣對手時的所有資料,而Values可以對需要的計算資料進行篩選,如果我們只需要james harden在主客場和不同勝負情況下的得分、籃板與助攻三項資料:

pd.pivot_table(df,index=[u'主客場',u'勝負'],values=[u'得分',u'助攻',u'籃板'])

2.4Aggfunc

aggfunc引數可以設定我們對資料聚合時進行的函式操作。

當我們未設定aggfunc時,它預設aggfunc='mean'計算均值。我們還想要獲得james harden在主客場和不同勝負情況下的總得分、總籃板、總助攻時:

pd.pivot_table(df,index=[u'主客場',u'勝負'],values=[u'得分',u'助攻',u'籃板'],aggfunc=[np.sum,np.mean])

2.5Columns

Columns類似Index可以設定列層次欄位,它不是一個必要引數,作為一種分割資料的可選方式。

  1. #fill_value填充空值,margins=True進行彙總
  2. pd.pivot_table(df,index=[u'主客場'],columns=[u'對手'],values=[u'得分'],aggfunc=[np.sum],fill_value=0,margins=1)

現在我們已經把關鍵引數都介紹了一遍,下面是一個綜合的例子:

table=pd.pivot_table(df,index=[u'對手',u'勝負'],columns=[u'主客場'],values=[u'得分',u'助攻',u'籃板'],aggfunc=[np.mean],fill_value=0)

結果如下:

aggfunc也可以使用dict型別,如果dict中的內容與values不匹配時,以dict中為準。

table=pd.pivot_table(df,index=[u'對手',u'勝負'],columns=[u'主客場'],values=[u'得分',u'助攻',u'籃板'],aggfunc={u'得分':np.mean,u'助攻':[min, max, np.mean]},fill_value=0)

結果就是助攻求min,max和mean,得分求mean,而籃板沒有顯示。