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

mac2025-05-25  58

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    values0 2017-05-01   a  2.5621571 2017-05-02   b  9.6048232 2017-05-03   c  4.7709683 2017-05-01   d  0.6548784 2017-05-02   a  8.8392815 2017-05-03   b  1.2111386 2017-05-01   c  9.5708867 2017-05-02   d  9.9150218 2017-05-03   a  8.551166-----key                a         b         c         ddate                                              2017-05-01  2.562157       NaN  9.570886  0.6548782017-05-02  8.839281  9.604823       NaN  9.9150212017-05-03  8.551166  1.211138  4.770968       NaN-----                valuesdate       key        2017-05-01 a       1.0             c       1.0             d       1.02017-05-02 a       1.0             b       1.0             d       1.02017-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    C0  1  3  1.01  2  3  1.02  2  4  NaN3  2  4  1.04  2  4  1.0------B  3  4A      1  1  02  1  3------B    3    4A          1  0.2  0.02  0.2  0.6--------B    3    4A          1  1.0  NaN2  1.0  2.0--------B      3    4  AllA                 1    1.0  NaN  1.02    1.0  2.0  3.0All  2.0  2.0  4.0--------

最新回复(0)