您的位置:首页 > 其它

Pyhton科学计算工具Pandas(十)—— 透视表和交叉表

2018-03-29 01:29 411 查看

Pyhton科学计算工具Pandas(十)—— 透视表和交叉表.ipynb

透视表

# 透视表:pivot_table
# pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')

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)
print('-----')

print(pd.pivot_table(df, values = 'values', index = 'date', columns = 'key', aggfunc=np.sum))  # 也可以写 aggfunc='sum'
print('-----')
# data:DataFrame对象
# values:要聚合的列或列的列表
# index:数据透视表的index,从原数据的列中筛选
# columns:数据透视表的columns,从原数据的列中筛选
# aggfunc:用于聚合的函数,默认为numpy.mean,支持numpy计算方法

print(pd.pivot_table(df, values = 'values', index = ['date','key'], aggfunc=len))
print('-----')
# 这里就分别以date、key共同做数据透视,值为values:统计不同(date,key)情况下values的平均值
# aggfunc=len(或者count):计数


date key    values
0 2017-05-01   a  4.395979
1 2017-05-02   b  8.212326
2 2017-05-03   c  9.759327
3 2017-05-01   d  9.336916
4 2017-05-02   a  0.170616
5 2017-05-03   b  6.034662
6 2017-05-01   c  2.305592
7 2017-05-02   d  0.707555
8 2017-05-03   a  7.578554
-----
key                a         b         c         d
date
2017-05-01  4.395979       NaN  2.305592  9.336916
2017-05-02  0.170616  8.212326       NaN  0.707555
2017-05-03  7.578554  6.034662  9.759327       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
-----


交叉表

# 交叉表:crosstab
# 默认情况下,crosstab计算因子的频率表,比如用于str的数据透视分析
# pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)

df = pd.DataFrame({'A': [1, 2, 2, 2, 2],
'B': [3, 3, 4, 4, 4],
'C': [1, 1, np.nan, 1, 1]})
print(df)
print('-----')

print(pd.crosstab(df['A'],df['B']))
print('-----频率表')
# 如果crosstab只接收两个Series,它将提供一个频率表。
# 用A的唯一值,统计B唯一值的出现次数

print(pd.crosstab(df['A'],df['B'],normalize=True))
print('-----归一化')
# normalize:默认False,将所有值除以值的总和进行归一化 → 为True时候显示百分比

print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum))
print('-----求和')
# values:可选,根据因子聚合的值数组
# aggfunc:可选,如果未传递values数组,则计算频率表,如果传递数组,则按照指定计算
# 这里相当于以A和B界定分组,计算出每组中第三个系列C的值

print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum, margins=True))
print('-----')
# 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
-----
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: