2018.03.29 python-pandas 数据透视pivot table / 交叉表crosstab

 1 #透视表 pivot table
 2 #pd.pivot_table(data,values=None,index=None,columns=None,
 3 import numpy as np
 4 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

--------