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区别

posted @ 2021-11-21 00:20  Hider1214  阅读(3255)  评论(0编辑  收藏  举报