Python學習筆記:pandas透視表之pivot_table、pivot


一、透視表

Excel 中有一個強大的功能 —— 數據透視表(pivot table)。

利用數據透視表可以快速的進行分類匯總,自由組合字段快速計算,而這些只需要拖拉拽就可以實現。

典型的數據格式是扁平的,只包含行和列,不方便總結信息。

而透視表可以快速抽取有用的信息。

Pandas 中,可以利用 pivot_table 函數實現該功能。

二、pivot_table函數介紹

使用語法:

DataFrame.pivot_table(data,
                     values=None,
                     index=None,
                     columns=None,
                     aggfunc='mean',
                     fill_value=None,
                     margins=False,
                     dropna=True,
                     margins_name='All',
                     observed=False,
                     sort=True)

參數解釋:

data -- DataFrame格式數據
values -- 需要匯總計算的列
index -- 行分組鍵
columns -- 列分組鍵
aggfunc -- 聚合函數,或函數列表,默認為平均值
fill_value -- 缺失值填充
margins -- 是否添加行列的總計
dropna -- 如果列的值都為NaN則不計算
margins_name -- 匯總行列名稱
observed -- 是否顯示觀測值

三、pivot_table實操

1.構造測試數據集

import pandas as pd
import numpy as np

df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two', 'two'],
                   'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'baz': [1, 2, 3, 4, 5, 6],
                   'zoo': ['x', 'y', 'z', 'q', 'w', 't']})
df
'''
  bar  baz  foo zoo
0   A    1  one   x
1   B    2  one   y
2   C    3  one   z
3   A    4  two   q
4   B    5  two   w
5   C    6  two   t
'''

pd.pivot_table(df, index='bar',values='baz', aggfunc=sum)
pd.pivot_table(df, index=['bar', 'foo'], aggfunc=np.mean, values='baz')
pd.pivot_table(df, index='bar', aggfunc=[np.sum, np.mean], values='baz')
pd.pivot_table(df, index='bar', columns='foo', aggfunc=[np.sum], values='baz')
pd.pivot_table(df, index='bar', columns='foo', aggfunc=[np.sum], values='baz', margins=True)

# 火箭隊當家球星James Harden某一賽季比賽數據
df2 = pd.read_csv(r'C:\Users\Hider\Desktop\basketball.txt', encoding='GBK')
df2

附上數據表:

對手,勝負,主客場,命中,投籃數,投籃命中率,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
灰熊,負,主,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
灰熊,負,客,6,19,0.316,0.222,4,8,20
76人,負,主,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
猛龍,負,主,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
籃網,勝,主,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

2.index

每個 pivot_table 必須擁有一個 index

# index 就是層次字段
pd.pivot_table(df2,index=u'對手')
pd.pivot_table(df2, index=[u'對手', u'主客場'])
pd.pivot_table(df2, index=[u'主客場', u'對手'])

3.values

對需要的計算數據進行篩選。

pd.pivot_table(df2, index=[u'主客場', u'勝負'], values=[u'得分', u'助攻', u'籃板'])
'''
               助攻         得分        籃板
主客場 勝負                                
主   勝   10.555556  34.222222  5.444444
    負    8.666667  29.666667  5.000000
客   勝    9.000000  32.000000  4.916667
    負    8.000000  20.000000  4.000000
'''

4.aggfunc

聚合時的函數操作,默認是求平均值。

pd.pivot_table(df2, index=[u'主客場', u'勝負'], values=[u'得分', u'助攻', u'籃板'], aggfunc=[np.sum, np.mean])
'''
        sum                mean                     
         助攻   得分  籃板         助攻         得分        籃板
主客場 勝負                                              
主   勝    95  308  49  10.555556  34.222222  5.444444
    負    26   89  15   8.666667  29.666667  5.000000
客   勝   108  384  59   9.000000  32.000000  4.916667
    負     8   20   4   8.000000  20.000000  4.000000
'''

aggfunc 也可以使用 dict 類型。

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

5.columns

設置列層次字段,作為可選方式。

pd.pivot_table(df2, index=u'對手', columns=u'主客場', values=u'得分', aggfunc=np.sum)

6.fill_value

填充空值。

pd.pivot_table(df2, index=u'對手', columns=u'主客場', values=u'得分', aggfunc=np.sum, fill_value=0)

7.margins

匯總行列。

pd.pivot_table(df2, index=u'對手', columns=u'主客場', values=u'得分', aggfunc=np.sum, fill_value=0, margins=True)

8.透視之后的過濾

建立透視表之后,可以通過 query 進行查詢結果。

df.query('bar == "A"')
df.query('bar == ["A","B"]')

四、pivot函數介紹

使用語法:

Pandas.pivot(data, index=None, columns=None, values=None)

實操:

df.pivot(index='foo', columns='bar', values='baz')
df.pivot(index='foo', columns='bar')['baz']

df.pivot(index='foo', columns='bar', values=['baz','zoo'])
# Exception: Data must be 1-dimensional

五、pivot 和 pivot_table 區別

pandas.pivot 的重點在於 reshape, 合並同類項,所以在行與列的交叉點值的索引應該是唯一值,如果不是唯一,則會報錯:

ValueError: Index contains duplicate entries, cannot reshape

盡量使用 pivot_table 可避免這個問題。

pivot_talbe 函數多了 aggfunc 參數,可專門指定對聚合后的行列做如何的操作,避免錯誤。

參考鏈接:pandas.DataFrame.pivot_table

參考鏈接:pandas.pivot

參考鏈接:在pandas中使用數據透視表

參考鏈接:Python中pandas透視表pivot_table功能詳解

參考鏈接:Pandas透視表(pivot_table)詳解

參考鏈接:pandas.pivot 和pandas.pivot_table區別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM