美文网首页
pandas透视表及交叉表的使用

pandas透视表及交叉表的使用

作者: 越大大雨天 | 来源:发表于2019-10-13 16:09 被阅读0次

    使用pandas也可很方便的实现类似excel的透视表功能

    透视表使用示例

    1. 首先先创建一个模拟的Dataframe数据
    import pandas as pd
    import numpy as np
    
    date = ['2017-5-1','2017-5-2','2017-5-3']*3
    rng = pd.to_datetime(date)
    df = pd.DataFrame({'date':rng,
                       'key':list('abcdabcda'),
                      'values':np.random.rand(9)*10})
    print(df)
    

    创建的原始数据结构如下:

            date  key    values
    0 2019-05-05   a  6.986712
    1 2019-05-10   b  8.784045
    2 2019-05-07   c  9.977014
    3 2019-05-05   d  5.246275
    4 2019-05-10   a  2.107733
    5 2019-05-07   b  6.585691
    6 2019-05-05   c  3.709266
    7 2019-05-10   d  6.500313
    8 2019-05-07   a  8.935606
    
    1. 透视表使用示例1
      使用pd.pivot_table方法进行表透视,操作示例为,以date列聚合结果为索引,将key列元素聚合并分列展示,得出对应的values列求和结果:
    print(pd.pivot_table(df, values="values", 
                         index="date", 
                         columns="key", 
                         aggfunc=np.sum))
    

    操作结果为:

    key                a         b         c         d
    date                                              
    2019-05-05  6.986712       NaN  3.709266  5.246275
    2019-05-07  8.935606  6.585691  9.977014       NaN
    2019-05-10  2.107733  8.784045       NaN  6.500313
    
    • pd.pivot_table方法参数释义:
      • data:DataFrame对象
      • values:要聚合的列或列的列表
      • index:数据透视表的index,从原数据的列中筛选
      • columns:数据透视表的columns,从原数据的列中筛选
      • aggfunc:用于聚合的函数,默认为numpy.mean,支持numpy计算方法,该处也可写aggfunc=sum
    1. 透视表使用示例2
      以date、key作为联合索引聚合,values列作为聚合的数据,按出现的次数进行聚合:
    print(pd.pivot_table(df, values="values", 
                         index=["date", "key"], 
                         aggfunc=len))
    

    操作结果为:

                    values
    date       key        
    2019-05-05 a       1.0
               c       1.0
               d       1.0
    2019-05-07 a       1.0
               b       1.0
               c       1.0
    2019-05-10 a       1.0
               b       1.0
               d       1.0
    

    注:这里的aggfunc用的是pivot_table内置的len方法,你也可以自定义函数,比如这里可以写成aggfunc=lambda x:x.count()结果是相同的。

    交叉表使用示例

    1. 同样,先创建一个Dataframe对象
    df = pd.DataFrame({'A': [1, 2, 2, 2, 2],
                       'B': [3, 3, 4, 4, 4],
                       'C': [1, 1, np.nan, 1, 1]})
    print(df)
    

    Dataframe结构为:

       A  B    C
    0  1  3  1.0
    1  2  3  1.0
    2  2  4  NaN
    3  2  4  1.0
    4  2  4  1.0
    
    1. 交叉表使用示例1
      该例表示为,在默认情况下,当只以两个series为参数时,它会以A列的唯一值为索引,统计B列中唯一值分别出现的频率:
    • 默认normalize=False
    print(pd.crosstab(df['A'],df['B']))
    

    输出结果为:

    B  3  4
    A      
    1  1  0
    2  1  3
    

    当前使用了默认的normalize=False参数

    • 指定normalize=True
      此时
    print(pd.crosstab(df['A'],df['B'], normalize=True))
    

    输出:输出的是占总频数的百分比

    B    3    4
    A          
    1  0.2  0.0
    2  0.2  0.6
    
    1. 交叉表使用示例2
      当传入values参数时和aggfunc参数时,会根据所传数值和聚合函数来进行聚合,相当于只使用A和B列界定分组,计算values聚合值:
    • 默认margins=False时:
    print(pd.crosstab(df['A'],df['B'],
                      values=df['C'],
                      aggfunc=np.sum))
    

    输出:

    B    3    4
    A          
    1  1.0  NaN
    2  1.0  2.0
    
    • 使用margins=True参数时,会添加行/列边距:
    print(pd.crosstab(df['A'],df['B'],
                      values=df['C'],
                      aggfunc=np.sum, 
                      margins=True))
    

    输出:

    B      3    4  All
    A                 
    1    1.0  NaN  1.0
    2    1.0  2.0  3.0
    All  2.0  2.0  4.0
    

    相关文章

      网友评论

          本文标题:pandas透视表及交叉表的使用

          本文链接:https://www.haomeiwen.com/subject/baphmctx.html