Pandas-高级处理(七):透视表(pivot_table)【以指定列作为行索引对另一指定列的值进行分组聚合操作】、交叉表(crosstab)【统计频率】
交叉表与透视表的作用
- 交叉表:计算一列数据对于另外一列数据的分组个数
- 透视表:指定某一列对另一列的关系
一、透视表
透视表是一种可以对数据动态排布并且分类汇总的表格格式。
透视表:透视表是将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数
- data.pivot_table()
- DataFrame.pivot_table([], index=[])
比如:pd.pivot_table(data=df, index='date', values='values', aggfunc=np.sum)
以 date 列作为行索引对values列进行分组聚合(sum)操作。
import numpy as np
import pandas as pd# 透视表: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 = \n", df)
print('-' * 200)# data:DataFrame对象
# values:要聚合的列或列的列表
# index:数据透视表的index,从原数据的列中筛选
# columns:数据透视表的columns,从原数据的列中筛选
# aggfunc:用于聚合的函数,默认为numpy.mean,支持numpy计算方法x1 = pd.pivot_table(data=df, values='values', index='date', aggfunc=np.sum) # 也可以写 aggfunc='sum'
print("x1 = pd.pivot_table(data=df, values='values', index='date', aggfunc=np.sum) = \n", x1)
print('-' * 200)# 这里就分别以date、key共同做数据透视,值为values:统计不同(date,key)情况下values的和
# aggfunc=len(或者count):计数
x2 = pd.pivot_table(df, values='values', index=['date', 'key'], aggfunc=np.sum)
print("x2 = pd.pivot_table(df, values='values', index=['date', 'key'], aggfunc=np.sum) = \n", x2)
print('-' * 200)# 这里就分别以date、key共同做数据透视,值为values:统计不同(date,key)情况下values的长度【aggfunc=len:计数】
x3 = pd.pivot_table(df, values='values', index=['date', 'key'], aggfunc=len)
print("x3 = pd.pivot_table(df, values='values', index=['date', 'key'], aggfunc=len) = \n", x3)
print('-' * 200)
打印结果:
df = date key values
0 2017-05-01 a 6.331764
1 2017-05-02 b 0.139295
2 2017-05-03 c 7.775829
3 2017-05-01 d 0.366474
4 2017-05-02 a 9.533083
5 2017-05-03 b 0.671094
6 2017-05-01 c 5.951416
7 2017-05-02 d 5.920482
8 2017-05-03 a 6.119202
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
x1 = pd.pivot_table(data=df, values='values', index='date', aggfunc=np.sum) = values
date
2017-05-01 12.649654
2017-05-02 15.592859
2017-05-03 14.566126
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
x2 = pd.pivot_table(df, values='values', index=['date', 'key'], aggfunc=np.sum) = values
date key
2017-05-01 a 6.331764c 5.951416d 0.366474
2017-05-02 a 9.533083b 0.139295d 5.920482
2017-05-03 a 6.119202b 0.671094c 7.775829
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
x3 = pd.pivot_table(df, values='values', index=['date', 'key'], aggfunc=len) = values
date key
2017-05-01 a 1.0c 1.0d 1.0
2017-05-02 a 1.0b 1.0d 1.0
2017-05-03 a 1.0b 1.0c 1.0
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Process finished with exit code 0
二、交叉表
交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)
- pd.crosstab(value1, value2)
import numpy as np
import pandas as pd# 交叉表: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 = \n", df)
print('-' * 200)# 如果crosstab只接收两个Series,它将提供一个频率表。
# 用A的唯一值,统计B唯一值的出现次数
x1 = pd.crosstab(df['A'], df['B'])
print("pd.crosstab(df['A'], df['B']) = \n", x1)
print('-' * 200)# normalize:默认False,将所有值除以值的总和进行归一化 → 为True时候显示百分比
x2 = pd.crosstab(df['A'], df['B'], normalize=True)
print("x2 = pd.crosstab(df['A'], df['B'], normalize=True) = \n", x2)
print('-' * 200)# values:可选,根据因子聚合的值数组
# aggfunc:可选,如果未传递values数组,则计算频率表,如果传递数组,则按照指定计算
# 这里相当于以A和B界定分组,计算出每组中第三个系列C的值
x3 = pd.crosstab(df['A'], df['B'], values=df['C'], aggfunc=np.sum)
print("x3 = pd.crosstab(df['A'], df['B'], values=df['C'], aggfunc=np.sum) = \n", x3)
print('-' * 200)# margins:布尔值,默认值False,添加行/列边距(小计)
x4 = pd.crosstab(df['A'], df['B'], values=df['C'], aggfunc=np.sum, margins=True)
print("x4 = pd.crosstab(df['A'], df['B'], values=df['C'], aggfunc=np.sum, margins=True) = \n", x4)
print('-' * 200)
打印结果:
df = 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
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pd.crosstab(df['A'], df['B']) = B 3 4
A
1 1 0
2 1 3
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
x2 = pd.crosstab(df['A'], df['B'], normalize=True) = B 3 4
A
1 0.2 0.0
2 0.2 0.6
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
x3 = 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
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
x4 = 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
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Process finished with exit code 0
三、案例分析
1 交叉表与透视表什么作用
探究股票的涨跌与星期几有关?
以下图当中表示,week代表星期几,1,0代表这一天股票的涨跌幅是好还是坏,里面的数据代表比例
可以理解为所有时间为星期一等等的数据当中涨跌幅好坏的比例
2 案例分析
2.1 数据准备
- 准备两列数据,星期数据以及涨跌幅是好是坏数据
- 进行交叉表计算
# 寻找星期几跟股票张得的关系
# 1、先把对应的日期找到星期几
date = pd.to_datetime(data.index).weekday
data['week'] = date# 2、假如把p_change按照大小去分个类0为界限
data['posi_neg'] = np.where(data['p_change'] > 0, 1, 0)# 通过交叉表找寻两列数据的关系
count = pd.crosstab(data['week'], data['posi_neg'])
但是我们看到count只是每个星期日子的好坏天数,并没有得到比例,该怎么去做?
- 对于每个星期一等的总天数求和,运用除法运算求出比例
# 算数运算,先求和
sum = count.sum(axis=1).astype(np.float32)# 进行相除操作,得出比例
pro = count.div(sum, axis=0)
2.2 查看效果
使用plot画出这个比例,使用stacked的柱状图
pro.plot(kind='bar', stacked=True)
plt.show()
2.3 使用pivot_table(透视表)实现
使用透视表,刚才的过程更加简单
# 通过透视表,将整个过程变成更简单一些
data_pivot = data.pivot_table(['posi_neg'], index='week')
data_pivot.plot(kind="bar")
plt.show()
Pandas-高级处理(七):透视表(pivot_table)【以指定列作为行索引对另一指定列的值进行分组聚合操作】、交叉表(crosstab)【统计频率】相关推荐
- python 数据分析(六)astype('category')按类别分组 + 分组聚合操作 + 透视表 + 交叉表 + excel表的数据处理
文章目录 一.按照类别单独分类astype() 1. astype()用法 二.时间操作 1. 第一种:直接利用to_datetime() 2. 第二种:Series.dt 三.分组聚合操作 1. 分 ...
- pandas使用read_csv函数读取csv数据、sort_index函数基于多层行索引对数据排序(设置ascending参数列表指定不同层行索引的排序方向)
pandas使用read_csv函数读取csv数据.index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引.sort_index函数基于多层行索引对数据排序(设置ascending ...
- pandas读取csv数据、参数指定作为行索引的数据列索引列表形成复合(多层)行索引、使用set_index函数把数据列转化为行索引(keys参数指定需要被转化的数据列)
pandas使用read_csv函数读取csv数据.index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引.header参数指定作为
- mysql 连边聚合_MySQL分组,聚合函数,连表查询,子查询
>>>分组: group by + group_concat 分组:类似于将一个班级的学生,按照性别或其他条件,分成若干个组,最终以小组为单位显示,如上图中,以post字段对表进行分 ...
- mysql分组聚合->连表联查->求topn
首先建立两个表如下: CREATE TABLE `student` (`id` INT(11) NOT NULL AUTO_INCREMENT,`name` VARCHAR(255) NOT NULL ...
- 在mysql表中如何变换列和行_在SQL中转换列和行的简单方法?
有几种方法可以转换这些数据.在你最初的帖子中,你说PIVOT对于这个场景来说似乎太复杂了,但是可以很容易地使用UNPIVOT和PIVOTSQL Server中的函数. 但是,如果您无法访问这些函数,则 ...
- Python+Pandas数据处理时的分裂与分组聚合操作
开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...
- 【Pandas分组聚合】进阶:透视表、交叉表(pivot_table() 、crosstab())
Pandas透视表.交叉表 创建DataFrame结构 透视表 pivot_table() 单列聚合 多列聚合 交叉表 crosstab() 计算分组频率 两列分组后求第三列的统计指标 创建DataF ...
- pandas使用pivot_table函数构建透视表:index指定聚合的行索引、columns指定聚合的列索引、aggfunc使用列表指定多个聚合函数(形成复合列索引)
pandas使用pivot_table函数构建透视表:index参数指定聚合的行索引.columns参数指定聚合的列索引.values参数指定需要进行聚合的数值数据列.aggfunc使用列表指定多个聚 ...
最新文章
- 【Kaggle-MNIST之路】两层的神经网络Pytorch(四行代码的模型)
- crntos7启动php命令_CentOS7设置php-fpm开机自启动
- [软技能] 请说说使用iconfont图标的优点和缺点
- deepfakes怎么用_[mcj]deepfakesApp使用说明(1)
- Openshift 4.4 静态 IP 离线安装系列:初始安装
- nginx配置详解1
- 2008生产实习 日程安排
- cnpack 菜单顺序
- python如何修改图片透明度_如何改变图像的不透明度
- 网站云服务器 网络拓扑,云服务器网络结构拓扑图
- SimpleFOC调参1-力矩控制
- 算数-02-史丰收算法
- 「详解」torch.nn.Fold和torch.nn.Unfold操作
- 关于mybatis中的大于号和小于号的错误
- sql trace 的几种方法
- Java 泛型类、泛型方法和泛型接口
- socket通信简介(概念、函数、原理)
- 二叉树:已知先序和中序求后序,已知中序和后序求先序
- Description 现举行新生歌手大赛,评分规则是这样的:一共有10个评委给每个歌手打分,分数采用 百分制,算分时去掉一个最高分,去掉一个最低分,取其余8个评委的平均分作为歌手的 得分。现有多个歌
- 并行计算--并发构造纵览
热门文章
- Docker+Jenkins+Harbor+Rancher持续集成部署分布式项目
- 红米android 升级包下载地址,红米手机2 MIUI9.0+Android7.1刷机包
- linux批量清理删除进程。
- 实验记录 | 6/7 收一下尾巴
- python爬虫解决使用代理报错ssl问题
- Element表格的竖向斑马纹、数据不同改变颜色(正数颜色为红色,负数颜色为绿色)
- WEB安全之HTML基础
- 目前互联网最详细的5G注册流程
- Linux查看当前目录及子目录大小
- 计算机网络知识复习(day01)--计算机网络相关概念及网络分层架构模型