1、透视表 pivot table
pd.pivot_table(data,values=None,index=None,columns=None,aggfunc='mean'
,fill_value=None,margins=False,dropna=True,margins_name='ALL')
其中,
data:DataFrame对象
values:要聚合的列或列的列表
index:数据透视的index,从原始数据的列中筛选
columns:数据透视表的columns,从原始数据的列中筛选
aggfunc:用于聚合的函数,默认为numpy,mean,支持numpy计算方法
import numpy as np
import pandas as pd
date = ['2019-1-1','2019-1-2','2019-1-3']*3
date_time = pd.to_datetime(date)
df = pd.DataFrame({'date':date_time,
'key':list('abcdabcab'),
'values':np.random.rand(9)*10})
print('------------原数据------------')
print(df)
print('------------透视表1------------')
#也可以aggfunc='sum'
print(pd.pivot_table(df,values = 'values',index = ['date'],columns='key',aggfunc=np.sum))
print('------------透视表2------------')
#分别以date,key共同做数据透视,值为values:统计不同(date,key)情况下values的计数
#aggfunc=len(或者count):计数
print(pd.pivot_table(df,values = 'values',index = ['date','key'],aggfunc=len))
输出结果:
------------原数据------------
date key values
0 2019-01-01 a 6.372699
1 2019-01-02 b 0.649605
2 2019-01-03 c 4.897285
3 2019-01-01 d 7.758373
4 2019-01-02 a 1.576888
5 2019-01-03 b 8.217029
6 2019-01-01 c 5.454403
7 2019-01-02 a 5.072132
8 2019-01-03 b 2.875602
------------透视表1------------
key a b c d
date
2019-01-01 6.372699 NaN 5.454403 7.758373
2019-01-02 6.649020 0.649605 NaN NaN
2019-01-03 NaN 11.092630 4.897285 NaN
------------透视表2------------
values
date key
2019-01-01 a 1.0
c 1.0
d 1.0
2019-01-02 a 2.0
b 1.0
2019-01-03 b 2.0
c 1.0
2、交叉表:crosstab
默认情况下,crosstab计算因子的频率,比如用于str的数据透视分析
pd.crosstab(index,columns,values=None,rownames=None
,colnames=None,aggfunc=None,margins=False,dropna=True,normalize=False)
import numpy as np
import pandas as pd
df = pd.DataFrame({'A':[1,2,2,2,2],
'B':[3,3,4,4,4],
'C':[1,1,np.nan,1,1]})
print('------------原数据------------')
print(df)
#如果crosstab只接收两个series,他将提供一个频率表
#用A的唯一值,统计B唯一值的出现次数 (A,B)= (1,3)C出现了1次 (A,B)= (2,4)出现了3次
print('------------交叉表1------------')
print(pd.crosstab(df['A'],df['B']))
print('------------交叉表2------------')
print(pd.crosstab(df['A'],df['B'],normalize=True))#以频率的方式显示
print('------------交叉表3------------')
print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum))#values:根据因子聚合的值数组
#aggfunc:如果未传递values数组,则计算频率表,如果传递数组,则按照指定计算
#这里相当于以A和B界定分组,计算出每组中第三个系列C的值
print('------------交叉表4------------')
print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum,margins=True))
#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
------------交叉表1------------
B 3 4
A
1 1 0
2 1 3
------------交叉表2------------
B 3 4
A
1 0.2 0.0
2 0.2 0.6
------------交叉表3------------
B 3 4
A
1 1.0 NaN
2 1.0 2.0
------------交叉表4------------
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