crosstab交叉表_2018.03.29 python-pandas 数据透视pivot table / 交叉表crosstab

1 #透视表 pivot table

2 #pd.pivot_table(data,values=None,index=None,columns=None,

3 importnumpy as np4 import pandas as pd aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='ALL')5 date = ['2017-5-1','2017-5-2','2017-5-3']*3

6 rng =pd.to_datetime(date)7 df = pd.DataFrame({'date':rng,8 'key':list('abcdabcda'),9 'values':np.random.rand(9)*10})10 print(df)11 print('-----')12

13 print(pd.pivot_table(df,values = 'values',index = ['date'],columns='key',aggfunc=np.sum))#也可以aggfunc='sum'

14 print('-----')15 #data:DataFrame对象

16 #values:要聚合的列或列的列表

17 #index:数据透视的index,从原始数据的列中筛选

18 #columns:数据透视表的columns,从原始数据的列中筛选

19 #aggfunc:用于聚合的函数,默认为numpy,mean,支持numpy计算方法

20 print(pd.pivot_table(df,values = 'values',index = ['date','key'],aggfunc=len))21 print('------')22 #这里就分别以date,key共同做数据透视,值为values:统计不同(date,key)情况下values的计数

23 #aggfunc=len(或者count):计数

结果:

date key    values

0 2017-05-01   a  2.562157

1 2017-05-02   b  9.604823

2 2017-05-03   c  4.770968

3 2017-05-01   d  0.654878

4 2017-05-02   a  8.839281

5 2017-05-03   b  1.211138

6 2017-05-01   c  9.570886

7 2017-05-02   d  9.915021

8 2017-05-03   a  8.551166

-----

key                a         b         c         d

date

2017-05-01  2.562157       NaN  9.570886  0.654878

2017-05-02  8.839281  9.604823       NaN  9.915021

2017-05-03  8.551166  1.211138  4.770968       NaN

-----

values

date       key

2017-05-01 a       1.0

c       1.0

d       1.0

2017-05-02 a       1.0

b       1.0

d       1.0

2017-05-03 a       1.0

b       1.0

c       1.0

------

1 #交叉表:crosstab

2 #默认情况下,crosstab计算因子的频率,比如用于str的数据透视分析

3 #pd.crosstab(index,columns,values=None,rownames=None

4 #,colnames=None,aggfunc=None,margins=False,dropna=True,normalize=False)

5 df = pd.DataFrame({'A':[1,2,2,2,2],6 'B':[3,3,4,4,4],7 'C':[1,1,np.nan,1,1]})8 print(df)9 print('------')10 print(pd.crosstab(df['A'],df['B']))11 print('------')12 #如果crosstab只接收两个series,他将提供一个频率表

13 #用A的唯一值,统计B唯一值的出现次数 (A,B)= (1,3)C出现了1次 (A,B)= (2,4)出现了3次

14

15 print(pd.crosstab(df['A'],df['B'],normalize=True))#以频率的方式显示

16 print('--------')17 print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum))#values:根据因子聚合的值数组

18 #aggfunc:如果未传递values数组,则计算频率表,如果传递数组,则按照指定计算

19 #这里相当于以A和B界定分组,计算出每组中第三个系列C的值

20 print('--------')21 print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum,margins=True))22 print('--------')23 #margins:布尔值,默认值False,添加行/列边距(小计)

结果:

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

------

B  3  4

A

1  1  0

2  1  3

------

B    3    4

A

1  0.2  0.0

2  0.2  0.6

--------

B    3    4

A

1  1.0  NaN

2  1.0  2.0

--------

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

--------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值