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

  • 相关阅读:
    react.js+axios跨域
    O2O项目之一 环境搭配
    跟scss相关的两个包
    [nodemon] app crashed
    解决node.js链接数据库时出现的报错 --- client does not support authentication
    在Xshell 运行angular 项目时,找不到node-sass模块,安装node-sass模块时,又出现权限问题
    ajax请求数据时,get和post的区别
    web前端如何性能优化提高加载速度
    js数组去重
    前端跨域
  • 原文地址:https://www.cnblogs.com/hider/p/15583148.html
Copyright © 2020-2023  润新知