美文网首页
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