zoukankan      html  css  js  c++  java
  • 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区别

  • 相关阅读:
    解决:Could not resolve archetype org.apache.maven.archetypes
    Spring MVC配置MyBatis输出SQL
    Spring集成MyBatis 通用Mapper以及 pagehelper分页插件
    关于SpringMVC或Struts2接受参数接收不到的原因
    配置quartz启动时就执行一次
    ajaxFileUpload进行文件上传时,总是进入error
    spring mvc注入配置文件里的属性
    java中将一个文件夹下所有的文件压缩成一个文件
    flume failed to start agent because dependencies were not found in classpath
    ubuntu不能安装pip unable to install pip in unbuntu
  • 原文地址:https://www.cnblogs.com/hider/p/15583148.html
Copyright © 2011-2022 走看看