1. 程式人生 > >2018.03.29 python-pandas 數據透視pivot table / 交叉表crosstab

2018.03.29 python-pandas 數據透視pivot table / 交叉表crosstab

none 交叉 篩選 OS func pos bsp class ros

 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
--------

2018.03.29 python-pandas 數據透視pivot table / 交叉表crosstab