pandas透视表及交叉表的使用
2019-10-13 本文已影响0人
越大大雨天
使用pandas也可很方便的实现类似excel的透视表功能
透视表使用示例
- 首先先创建一个模拟的Dataframe数据:
import pandas as pd
import numpy as np
date = ['2017-5-1','2017-5-2','2017-5-3']*3
rng = pd.to_datetime(date)
df = pd.DataFrame({'date':rng,
'key':list('abcdabcda'),
'values':np.random.rand(9)*10})
print(df)
创建的原始数据结构如下:
date key values
0 2019-05-05 a 6.986712
1 2019-05-10 b 8.784045
2 2019-05-07 c 9.977014
3 2019-05-05 d 5.246275
4 2019-05-10 a 2.107733
5 2019-05-07 b 6.585691
6 2019-05-05 c 3.709266
7 2019-05-10 d 6.500313
8 2019-05-07 a 8.935606
-
透视表使用示例1:
使用pd.pivot_table
方法进行表透视,操作示例为,以date列聚合结果为索引,将key列元素聚合并分列展示,得出对应的values列求和结果:
print(pd.pivot_table(df, values="values",
index="date",
columns="key",
aggfunc=np.sum))
操作结果为:
key a b c d
date
2019-05-05 6.986712 NaN 3.709266 5.246275
2019-05-07 8.935606 6.585691 9.977014 NaN
2019-05-10 2.107733 8.784045 NaN 6.500313
-
pd.pivot_table
方法参数释义:-
data
:DataFrame对象 -
values
:要聚合的列或列的列表 -
index
:数据透视表的index,从原数据的列中筛选 -
columns
:数据透视表的columns,从原数据的列中筛选 -
aggfunc
:用于聚合的函数,默认为numpy.mean,支持numpy计算方法,该处也可写aggfunc=sum
-
-
透视表使用示例2:
以date、key作为联合索引聚合,values列作为聚合的数据,按出现的次数进行聚合:
print(pd.pivot_table(df, values="values",
index=["date", "key"],
aggfunc=len))
操作结果为:
values
date key
2019-05-05 a 1.0
c 1.0
d 1.0
2019-05-07 a 1.0
b 1.0
c 1.0
2019-05-10 a 1.0
b 1.0
d 1.0
注:这里的aggfunc用的是pivot_table内置的len
方法,你也可以自定义函数,比如这里可以写成aggfunc=lambda x:x.count()
结果是相同的。
交叉表使用示例
- 同样,先创建一个Dataframe对象
df = pd.DataFrame({'A': [1, 2, 2, 2, 2],
'B': [3, 3, 4, 4, 4],
'C': [1, 1, np.nan, 1, 1]})
print(df)
Dataframe结构为:
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
该例表示为,在默认情况下,当只以两个series为参数时,它会以A列的唯一值为索引,统计B列中唯一值分别出现的频率:
- 默认
normalize=False
时
print(pd.crosstab(df['A'],df['B']))
输出结果为:
B 3 4
A
1 1 0
2 1 3
当前使用了默认的normalize=False
参数
- 指定
normalize=True
时
此时
print(pd.crosstab(df['A'],df['B'], normalize=True))
输出:输出的是占总频数的百分比
B 3 4
A
1 0.2 0.0
2 0.2 0.6
-
交叉表使用示例2
当传入values参数时和aggfunc参数时,会根据所传数值和聚合函数来进行聚合,相当于只使用A和B列界定分组,计算values聚合值:
- 默认
margins=False
时:
print(pd.crosstab(df['A'],df['B'],
values=df['C'],
aggfunc=np.sum))
输出:
B 3 4
A
1 1.0 NaN
2 1.0 2.0
- 使用
margins=True
参数时,会添加行/列边距:
print(pd.crosstab(df['A'],df['B'],
values=df['C'],
aggfunc=np.sum,
margins=True))
输出:
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