Pandas-高级处理(七):透视表(pivot_table)【以指定列作为行索引对另一指定列的值进行分组聚合操作】、交叉表(crosstab)【统计频率】

本文主要是介绍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)【统计频率】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128676

相关文章

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

如何使用Spring boot的@Transactional进行事务管理

《如何使用Springboot的@Transactional进行事务管理》这篇文章介绍了SpringBoot中使用@Transactional注解进行声明式事务管理的详细信息,包括基本用法、核心配置... 目录一、前置条件二、基本用法1. 在方法上添加注解2. 在类上添加注解三、核心配置参数1. 传播行为(

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前