4.5 创建透视表与交叉表

news2024/9/28 23:34:31

4.5 创建透视表与交叉表

  • 4.5.1利用pivot_table函数可以实现透视表
    • pivot_table函数的常用参数及其说明
  • 4.5.2 使用crosstab函数创建交叉表
    • crosstab函数的常用参数及其说明
  • 4.5.3 任务实现
  • 数据
  • 完整代码

数据透视表(Pivot Table)是数据分析中一种常用的工具之一,根据一个或多个键值对数据进行聚合,根据行或列的分组键将数据划分到各个区域。在pandas中,除了可以使用groupby对数据分组聚合实现透视功能外,还提供了更为简单的方法。这里以菜单订单数据为例制作透视表与交叉表,分析不同菜品的销量和金额之间的关系。
(1)使用pivot_table函数制作菜品日销量透视表。
(2)使用crosstab函数制作菜品销量交叉表。

4.5.1利用pivot_table函数可以实现透视表

pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc=‘mean’, fill_value=None, margins=False, dropna=True, margins_name=‘All’)

pivot_table函数的常用参数及其说明

在这里插入图片描述

import pandas as pd
import numpy as np
detail = pd.read_csv('E:/Input/ptest.csv', encoding='ANSI')
## 1、使用订单号作为透视表索引制作透视表
# 以id作为分组键创建的订单透视表
detailPivot = pd.pivot_table(detail[['id', 'counts', 'amounts']], index='id')
print(detailPivot)

在这里插入图片描述

由上面结果可以看出,在不特殊指定聚合函数aggfunc时,会默认使用numpy.mean进行聚合运算,numpy.mean会自动过滤掉非数值类型数据。可以通过指定aggfunc参数修改聚合函数。

## 2、修改聚合函数后的透视表
# 以id作为分组键创建的订单销量与售价总和透视表
detailPivot2 =pd.pivot_table(detail[['id', 'counts', 'amounts']], index='id', aggfunc=np.sum)
print(detailPivot2)

在这里插入图片描述

和groupby方法分组的时候相同,pivot_table函数在创建透视表的时候分组键index可以有多个。

## 3、使用id和name作为索引的透视表
detailPivot3 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index=['id', 'name'], aggfunc=np.sum)
print(detailPivot3)

通过设置columns参数可以指定列分组。

## 4、指定name为列分组键的透视表
detailPivot4 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', columns='name', aggfunc=np.sum)
print(detailPivot4)

当全部数据列数很多时,若只想要显示某列,可以通过指定values参数来实现。

## 5、指定某些列制作透视表
detailPivot5 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', values='counts', aggfunc=np.sum)
print(detailPivot5)

当某些数据不存在时,会自动填充NaN,因此可以指定fill_value参数,表示当存在缺失值时,以指定数值进行填充。

## 6、对透视表中的缺失值进行填充
detailPivot6 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', columns='name', aggfunc=np.sum, fill_value=0)
print(detailPivot6)

可以更改margins参数,查看汇总数据。

## 7、在透视表中添加汇总数据,结果集中会出现名为All的行和列
detailPivot7 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', columns='name', aggfunc=np.sum, 
                              fill_value=0, margins=True)
print(detailPivot7)

4.5.2 使用crosstab函数创建交叉表

交叉表是一种特殊的透视表,主要用于计算分组频率。
由于交叉表是透视表的一种,其参数基本保持一致,不同之处在于crosstab函数中的index,columns,values填入的都是对应的从Dataframe中取出的某一列。
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)

crosstab函数的常用参数及其说明

在这里插入图片描述

# 4.5.2 使用crosstab函数创建交叉表
# 4.5.2 使用crosstab函数创建交叉表
detailCross = pd.crosstab(index = detail['id'], columns=detail['name'], 
                          values=detail['counts'], aggfunc=np.sum)
print(detailCross)

4.5.3 任务实现

# 4.5.3 任务实现
## 1、创建单日菜品成交总额与总数均价透视表
import pandas as pd
import numpy as np
detail = pd.read_csv('E:/Input/ptest.csv', encoding='ANSI')
# print(detail)
detail['time'] = pd.to_datetime(detail['time'])
detail['date'] = [i.date() for i in detail['time']]
# print(detail['date'])
PivotDetail = pd.pivot_table(detail[['date', 'name', 'counts', 'amounts']],
                             index='date', aggfunc=np.sum, margins=True)
print(PivotDetail)
# 2、创建单个菜品单日成交总额透视表
## 方法1
PivotDetail2 = pd.pivot_table(detail[['date', 'name', 'amounts']],
                              index='date',columns='name', aggfunc=np.sum, margins=True)
print(PivotDetail2)
## 方法2
CrossDetail2 = pd.crosstab(index=detail['date'], columns=detail['name'],
                           values=detail['amounts'], aggfunc=np.sum, margins=True)
print(CrossDetail2)

数据

完整代码

import pandas as pd
import numpy as np
detail = pd.read_csv('E:/Input/ptest.csv', encoding='ANSI')
print(detail)
## 1、使用订单号作为透视表索引制作透视表
# 以id作为分组键创建的订单透视表
detailPivot = pd.pivot_table(detail[['id', 'counts', 'amounts']], index='id')
print(detailPivot)

## 2、修改聚合函数后的透视表
# 以id作为分组键创建的订单销量与售价总和透视表
detailPivot2 =pd.pivot_table(detail[['id', 'counts', 'amounts']], index='id', aggfunc=np.sum)
print(detailPivot2)

## 3、使用id和name作为索引的透视表
detailPivot3 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index=['id', 'name'], aggfunc=np.sum)
print(detailPivot3)

## 4、指定name为列分组键的透视表
detailPivot4 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', columns='name', aggfunc=np.sum)
print(detailPivot4)

## 5、指定某些列制作透视表
detailPivot5 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', values='counts', aggfunc=np.sum)
print(detailPivot5)

## 6、对透视表中的缺失值进行填充
detailPivot6 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', columns='name', aggfunc=np.sum, fill_value=0)
print(detailPivot6)

## 7、在透视表中添加汇总数据,结果集中会出现名为All的行和列
detailPivot7 = pd.pivot_table(detail[['id', 'name', 'counts', 'amounts']],
                              index='id', columns='name', aggfunc=np.sum, 
                              fill_value=0, margins=True)
print(detailPivot7)

# 4.5.2 使用crosstab函数创建交叉表
detailCross = pd.crosstab(index=detail['id'], columns=detail['name'],
                          values=detail['counts'], aggfunc=np.sum)
print(detailCross)

# 4.5.3 任务实现
## 1、创建单日菜品成交总额与总数均价透视表
import pandas as pd
import numpy as np
detail = pd.read_csv('E:/Input/ptest.csv', encoding='ANSI')
# print(detail)
detail['time'] = pd.to_datetime(detail['time'])
detail['date'] = [i.date() for i in detail['time']]
# print(detail['date'])
PivotDetail = pd.pivot_table(detail[['date', 'name', 'counts', 'amounts']],
                             index='date', aggfunc=np.sum, margins=True)
print(PivotDetail)
# 2、创建单个菜品单日成交总额透视表
## 方法1
PivotDetail2 = pd.pivot_table(detail[['date', 'name', 'amounts']],
                              index='date',columns='name', aggfunc=np.sum, margins=True)
print(PivotDetail2)
## 方法2
CrossDetail2 = pd.crosstab(index=detail['date'], columns=detail['name'],
                           values=detail['amounts'], aggfunc=np.sum, margins=True)
print(CrossDetail2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

018 - C++ 类和结构体中的静态(static)

上一期我们讨论了 C 中的 static 关键字以及它在类或结构体之外的意义。本期我们讨论 static 在一个类或一个结构体中的具体情况。 先了解这些 在几乎所有面向对象的语言中,静态在一个类中意味着特定的东西。这意味着在类的所有实例中,这个变量只有一个…

【c#串口通信从小白到大神(5)】如何打开串口

1、新建一个winform程序 这里以visual studio 2019 社区版为例,关于visual studio 2019 社区版的下载链接请点击这里:如何下载安装visual studio 2019 社区版 第1步、打开visual studio 2019 ,出现下图: 第2步、点击“创建新项目”,如下图: 第3步、选择 “Windows 窗…

深眸科技围绕机器视觉技术,加速实现制造行业生产线智能化升级

工业4.0时代,是以智能制造为代表的第四次工业革命时代。随着人工智能的高速发展,机器视觉作为当前制造业质量控制领域的重要技术之一,在各行各业的应用逐渐广泛,其行业市场需求进一步飙升。据GGII预测,预计2025年&…

openEuler实验-使用Shell脚本实现局域网MAC地址收集和FTP服务监控

linux的简单运用 目录 前言 1. 实验目的 2. 实验内容 3. 实验知识点 4. 实验时长 5. 实验环境 实验分析 部署FTP服务器 1)安装FTP服务 2)查看FTP服务 3)启动FTP服务 4)关闭FTP服务 收集MAC地址 1)修改主…

C++17字符流以及C++11文件流以及IO流

getline() 有时候我们希望在最终的字符串中保留输入时的空白符,这时候应该用getline函数来替代原来的>>运算符。( cin 不能输入包含嵌入空格的字符串)。 getline()函数的参数是一个输入流和一个string对象,原型是&#xf…

threejs的使用

threejs介绍: Three.js是一款基于WebGL的JavaScript 3D库,用于创建和渲染3D图形场景。它提供了一个简单易用的接口,让开发者可以通过JavaScript代码创建出高度交互性和可视化的3D场景。Three.js提供了很多可用的3D对象和材质,例如…

C++ -2- 类和对象(上)| 什么是类

​ 文章目录 1.面向过程与面向对象2.类的引入3.类的定义两种定义方式 4.类的访问限定符5.类的作用域6.类的示例化7.类的对象大小计算8.类成员函数的this指针C语言和C的对比(this指针)空指针的问题 C语言和C实现Stack对比 1.面向过程与面向对象 C:面向过程&#xf…

java获取请求ip的方法

在上篇文章中我们介绍了 java获取请求 ip的方法,那么这篇文章我们就来详细讲解下获取请求 ip的方法。获取请求 ip的方法是基于 HTTP协议的,其原理如下: 1、用 web应用程序,将 web服务器端与客户端通过 HTTP协议通信。 2、客户端发…

LNMP架构和论坛搭建以及一键部署

数据流向 一、Nginx服务安装 1、关闭防火墙 [rootking ~]# systemctl stop firewalld [rootking ~]# systemctl disable firewalld [rootking ~]# setenforce 0 2、将所需软件包拖入/opt目录下 3、安装依赖包 yum -y install pcre-devel zlib-devel gcc gcc-c make 4、创建运…

Feign快速入门

文章目录 一、Feign1.1 Feign介绍1.2 Feign的使用步骤1.3 Feign的自定义配置1.3.1 配置方法 1.4 Feign的优化 一、Feign 1.1 Feign介绍 Feign是一个Java HTTP客户端,它使开发人员可以轻松地与RESTful API进行交互。Feign使用注释来描述REST API,它还支持…

Springboot整合Junit5

1 SpringBoot整合Junit (一)junit5 介绍 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不同。由三个不同子项目的几个不同模块组成。 JUnit 5 JUnit Platfo…

音视频开发十九:SDL线程和事件

SDL事件相关API DL_Event 是SDL库中使用的一个数据结构,用于表示系统中发生的事件。一个事件可以是键盘按键、鼠标移动、游戏手柄移动、窗口事件等。SDL_Event 结构包含有关事件类型、事件发生时间和事件参数的详细信息。 SDL_Event 结构具有以下成员:…

[5 种有效方法] 适用于 Android 的通用解锁图案/密码

在当今世界,保护您的密码对于您的文件和数据的安全至关重要,尤其是在第三方应用程序盛行的情况下。为这些应用程序注册帐户不是问题,就像记住它们一样。但是,如果您不知何故忘记了手机密码,您仍然可以在不丢失宝贵数据…

突破规模化运维瓶颈 SREWorks云原生数智运维平台揭秘

作者: 钟炯恩——阿里云大数据基础工程技术团队运维专家 引言 突破规模化运维瓶颈是诸多IT规模增长的企业及组织当前遇到的比较棘手的问题。面对这些问题,多数人的第一反应是上云。但是上云之后我们会发现,即使云上的架构规模增大&#xf…

如何使用DNS实现融合CDN功能

将托管DNS解决方案与CDN配对可为您的网站提供额外的性能、可靠性和灵活性。 域名系统(DNS)是一种用于计算机、服务或连接到Internet或专用网络的任何资源的分层分布式命名系统,它将各种信息与分配给每个参与实体的域名相关联,它基…

ChatGPT 火了,一大批开源平替也来了

ChatGPT 凭一己之力让全球为 AI 沸腾,引发了科技巨头之间的聊天机器人军备竞赛。 众所周知,ChatGPT 的背后技术是 GPT(Generative Pre-trained Transformer)模型。GPT 是一种基于 Transformer 模型的自然语言处理模型,由 OpenAI 公司开发。它…

【elasticsearch部署】

安装elasticsearch 1.部署单点es1.1.创建网络1.2.加载镜像1.3.运行 2.部署kibana2.1.部署2.2.DevTools 3.安装IK分词器3.1.在线安装ik插件(较慢)3.2.离线安装ik插件(推荐)1)查看数据卷目录2)解压缩分词器安…

前端必备的nginx知识点

nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全_java冯坚持的博客-CSDN博客 前端必备的nginx知识点 - 掘金 前言: 最近在做一个后台项目 ngixn简介 nginx是一款轻量级&…

【Sql】sql语句练习随记

本文通过最经典的“学生-成绩-课程-教师”表来帮助练习sql语句。 STUDENT表 SNO 学号SNAME 姓名SSEX 性别SBIRTHDAY 生日CLASS 班级 SCORE表 SNO 学号CNO 课程编号DEGREE 分数 COURSE表 CNO 课程编号CNAME 课程名称TNO 教师编号 TEACHER表 TNO 教师编号TNAME 教师姓名TS…

(包教包会)最强分布式锁工具:Redisson

今天来聊聊分布式锁的最强实现:Redisson 从分布式锁到Redisson实现非常详细,适合慢慢咀嚼~ 一. Redisson概述 1.1 什么是Redisson? Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。…