Python数据分析NumPy和pandas(三十四、数据透视表和交叉表)

数据透视表是电子表格程序和其他数据分析软件中常见的数据汇总工具。它按一个或多个键聚合数据表,一些组键沿行,一些组键沿列将数据排列在一个矩形中。我们使用 pandas 的 groupby 结合分层索引在Python 中实现数据透视表。DataFrame 有一个 pivot_table 方法,同时pandas也有一个 pivot_table 函数。除了为 groupby 提供方便的接口外,pivot_table还可以添加部分总计(边距)。

针对之前的小费数据集tip.csv,如果我们要计算一个按行中的日期和 smoker 排列的组均值表(默认pivot_table聚合类型),可以用如下代码实现。先看下tips.csv文件中的数据内容:

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
print(tips.head())
tips["tip_pct"] = tips["tip"] / tips["total_bill"]result = tips.pivot_table(index=["day", "smoker"], values=["size", "tip", "tip_pct", "total_bill"])
print(result)

使用pandas对象的pivot_table方法,按day、smoker键,形成透视表格,输出结果如下:

sizetiptip_pcttotal_bill
daysmoker
FriNo2.2500002.8125000.15165018.420000
Yes2.0666672.7140000.17478316.813333
SatNo2.5555563.1028890.15804819.661778
Yes2.4761902.8754760.14790621.276667
SunNo2.9298253.1678950.16011320.506667
Yes2.5789473.5168420.18725024.120000
ThurNo2.4888892.6737780.16029817.113111
Yes2.3529413.0300000.16386319.190588

以上结果也可以使用 tips.groupby([“day”, “smoker”]).mean() 直接生成。现在,如果我们按时间分组(time和day),并将time和day放在行中,smoker放在表列中,同时只取 tip_pct 和 size 的平均值:

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]result = tips.pivot_table(index=["time", "day"], columns="smoker", values=["tip_pct", "size"])
print(result)

输出结果:

sizetip_pct
smokerNoYesNoYes
timeday
DinnerFri2.0000002.2222220.1396220.165347
Sat2.5555562.4761900.1580480.147906
Sun2.9298252.5789470.1601130.187250
Thur2.000000NaN0.159744NaN
LunchFri3.0000001.8333330.1877350.188937
Thur2.5000002.3529410.1603110.163863

下面我们通过传递 margins=True 来扩充此表,让表增加按行的总计和按列的总计,总计行和列会具备All标签(索引):

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]result = tips.pivot_table(index=["time", "day"], columns="smoker", values=["tip_pct", "size"], margins=True)
print(result)

输出结果:

sizetip_pct
smokerNoYesAllNoYesAll
timeday
DinnerFri2.0000002.2222222.1666670.1396220.1653470.158916
Sat2.5555562.4761902.5172410.1580480.1479060.153152
Sun2.9298252.5789472.8421050.1601130.1872500.166897
Thur2.000000NaN2.0000000.159744NaN0.159744
LunchFri3.0000001.8333332.0000000.1877350.1889370.188765
Thur2.5000002.3529412.4590160.1603110.1638630.161301
All2.6688742.4086022.5696720.1593280.1631960.160803

从上面输出可以看出,列方向,All 值是列的平均值;行方向,All值是No smoker和Yes somker的平均值。

上面使用的使用的是pivot_table默认使用的聚合函数 mean ,要使用其他函数可以将聚合函数或函数列表传递给pivot_table的 aggfunc 关键字参数。例如,下面我们使用 “count” 或 len 来计算组大小(计数或频率)(“count”计数排除数据组内的 null 值,而 len 则不会):

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]result = tips.pivot_table(index=["time", "smoker"], columns="day", values="tip_pct", aggfunc=len, margins=True)print(result)

输出结果:

dayFriSatSunThurAll
timesmoker
DinnerNo3.045.057.01.0106
Yes9.042.019.0NaN70
LunchNo1.0NaNNaN44.045
Yes6.0NaNNaN17.023
All19.087.076.062.0244

如果要填充组中数据的空值(或NA),我们还可以使用pivot_table的参数fill_value:

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]result = tips.pivot_table(index=["time", "size", "smoker"], columns="day", values="tip_pct", fill_value=0)print(result)

输出结果:

dayFriSatSunThur
timesizesmoker
Dinner1No0.0000000.1379310.0000000.000000
Yes0.0000000.3257330.0000000.000000
2No0.1396220.1627050.1688590.159744
Yes0.1712970.1486680.2078930.000000
3No0.0000000.1546610.1526630.000000
.....................
Lunch3Yes0.0000000.0000000.0000000.204952
4No0.0000000.0000000.0000000.138919
Yes0.0000000.0000000.0000000.155410
5No0.0000000.0000000.0000000.121389
6No0.0000000.0000000.0000000.173706

21 rows × 4 columns

下图是pivot_table 函数参数的列表:

交叉制表:交叉表:是计算组频率的数据透视表的一种特殊情况。

我们用代码示例来学习。下面代码,我们按国籍来统计各个国家的人是习惯使用左手还是右手,可以使用上面学习的 pivot_table 来实现,但 pandas.crosstab 函数会更方便:

import numpy as np
import pandas as pd
from io import StringIO# 用表格样式的字符串创建一个pandas对象
data = """Sample  Nationality  Handedness
1   USA  Right-handed
2   Japan    Left-handed
3   USA  Right-handed
4   Japan    Right-handed
5   Japan    Left-handed
6   Japan    Right-handed
7   USA  Right-handed
8   USA  Left-handed
9   Japan    Right-handed
10  USA  Right-handed"""
data = pd.read_table(StringIO(data), sep="\s+")
print(data)# 按国籍Nationality,统计惯用手Handedness数据
result = pd.crosstab(data["Nationality"], data["Handedness"], margins=True)
print(result)

data输出:

SampleNationalityHandedness
01USARight-handed
12JapanLeft-handed
23USARight-handed
34JapanRight-handed
45JapanLeft-handed
56JapanRight-handed
67USARight-handed
78USALeft-handed
89JapanRight-handed
910USARight-handed

result输出:

HandednessLeft-handedRight-handedAll
Nationality
Japan235
USA145
All3710

crosstab 的前两个参数都可以是一个数组、 Series 或数组列表。再看tips.csv数据示例:

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]result = pd.crosstab([tips["time"], tips["day"]], tips["smoker"], margins=True)
print(result)

输出结果:

smokerNoYesAll
timeday
DinnerFri3912
Sat454287
Sun571976
Thur101
LunchFri167
Thur441761
All15193244

总结:掌握 pandas 的数据分组工具的使用,对数据清理和建模以及统计分析非常有用。在学完这些基础之后,我们将用真实数据对 groupby 的使用进行示例学习。不过,在这之前,我们掌握时间序列数据的处理。下一次学习时间序列数据处理。 

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

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

相关文章

应用系统开发(10) 钢轨缺陷的检测系统

涡流检测系统框图 其中信号发生器为一定频率的正弦信号作为激励信号,这个激励信号同时输入给交流电桥中的两个检测线圈,将两个线圈输出的电压差值作为差分信号引出至差分放大电路进行放大,经过放大后信号变为低频的缺陷信号叠加在高频载波上…

Vanna使用ollama分析本地MySQL数据库 加入redis保存训练记录

相关代码 from vanna.base.base import VannaBase from vanna.chromadb import ChromaDB_VectorStore from vanna.ollama import Ollama import logging import os import requests import json import pandas as pd import chromadb import redis import pickle from IPython.…

基于Java Springboot校园疫情防控系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

《探索 Spring 核心容器:Bean 的奇妙世界》

一、Spring 核心容器与 Bean 的关系 Spring 核心容器是 Spring 框架的重要组成部分,负责管理和组织应用程序中的对象,而 Bean 则是构成应用程序主干并由 Spring IoC 容器管理的对象,二者紧密相连。 Spring 的核心容器由多个模块组成&#xf…

基于卷积神经网络的航空发动机剩余寿命预测Matlab实现

本文利用NASA提供的涡扇发动机退化数据集,进行数据预处理,构建训练样本和测试样本,然后搭建卷积神经网络(Convolutional Neural Network,CNN),学习训练数据,最后利用测试数据,分析神…

day02(单片机高级)单片机控制ESP8266连接阿里云

目录 单片机控制ESP8266连接阿里云物联平台 MQTT协议简介 订阅和发布 cJSON简介 云平台搭建 注册和登录 实例的开通和创建 产品和设备的创建 创建产品 添加设备 功能定义 发布上线 MQTTFX工具使用 发布和订阅 订阅 发布 MQTT固件烧录 AT指令验证 调试验证订阅 单片机控制ESP826…

社交电商的优势及其与 AI 智能名片小程序、S2B2C 商城系统的融合发展

摘要:本文深入分析了社交电商相较于传统电商的优势,包括门槛低、易操作、更生活化和可团队化运作等特点。同时,探讨了 AI 智能名片小程序和 S2B2C 商城系统在社交电商发展中的作用,以及它们与社交电商融合所带来的新机遇和发展前景…

uni-app快速入门(八)--常用内置组件(上)

uni-app提供了一套基础组件&#xff0c;类似HTML里的标签元素&#xff0c;不推荐在uni-app中使用使用div等HTML标签。在uni-app中&#xff0c;对应<div>的标签是view&#xff0c;对应<span>的是text&#xff0c;对应<a>的是navigator&#xff0c;常用uni-app…

Jmeter的后置处理器(二)

5--JSR223 PostProcessor 功能特点 自定义后处理逻辑&#xff1a;使用脚本语言编写自定义的后处理逻辑。支持多种脚本语言&#xff1a;支持 Groovy、JavaScript、BeanShell 等脚本语言。动态参数传递&#xff1a;将提取的数据存储为变量&#xff0c;供后续请求使用。灵活性高…

基于SpringBoot3+mybatis搭建的历史上的今天API接口服务 及 Mybatis 应该有个更好的方法来隐藏 Pojo 类中的字段

一、Mybatis有没有比较好的方法隐藏 Pojo 类中的字段 使用 Mybatis 时&#xff0c;为了实现通用的CURD&#xff0c;在定义实体类pojo时&#xff0c;会尽量将能用得上的数据库字段都定义到 pojo中&#xff0c;但是在查询的时候却有不一样的需求。mybatis的文档地址链接&#xff…

SLAM-evo 评估

文章目录 1.evo介绍1.1.evo安装1.1.2.evo的安装(evo共有两种安装方式)1.1.2.1.采用pip安装&#xff0c;直接安装最新的稳定发行版&#xff08;在翻墙的情况下可以使用&#xff09;将路径添加到系统 PATH 中1.1.2.2.源码安装 &#xff0c;下载源码进行安装&#xff08;必须翻墙&…

【机器学习chp3】判别式分类器:线性判别函数、线性分类器、广义线性分类器、分段线性分类器

前言&#xff1a; 本文遗留问题&#xff1a;&#xff08;1&#xff09;对最小平方误差分类器的理解不清晰.&#xff08;2&#xff09;分段线性判别函数的局部训练法理解不清晰。 推荐文章1&#xff0c;其中有关于感知机的分析 【王木头从感知机到神经网络】-CSDN博客 推荐文…

04 搭建linux驱动开发环境

虽然 petalinux 功能很全面&#xff0c;但是其编译速度较慢&#xff0c;不适用于驱动调试阶段&#xff08;因为驱动调试阶段会频繁修改驱动模块、内核、设备树等&#xff09;&#xff0c;因此本章将采用分步编译的方式来编译启动开发板所需要的各种镜像文件&#xff0c;虽然步骤…

Linux性能优化之火焰图的起源

Linux火焰图的起源与性能优化专家 Brendan Gregg 密切相关&#xff0c;他在 2011 年首次提出这一工具&#xff0c;用于解决性能分析过程中可视化和数据解读的难题。 1. 背景&#xff1a;性能优化的需求 在现代计算中&#xff0c;性能优化往往需要对程序执行中的热点和瓶颈进行…

半桥驱动芯片调试中的问题

结论&#xff1a;低于12V的场景应用分立的MOS驱动电路压根不合适&#xff0c;选用集成桥臂的芯片合适。 HIN的输入电平不能是长时间的高电平&#xff0c;否则自举电容没法充放电从而没办法自举升压&#xff0c;上管无法控制&#xff1a; 电容C2的容值应该尽可能大&#xff…

【C++】类和对象-深度剖析默认成员函数-上

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…

RabbitMQ黑马笔记

目录 1.初识MQ 1.1.同步和异步通讯 1.1.1.同步通讯 1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门 2.1.安装RabbitMQ 2.2.RabbitMQ消息模型 2.3.导入Demo工程 2.4.入门案例 2.4.1.publisher实现 2.4.2.consumer实现 2.5.总结 3.SpringAMQP 3.1.Basic Queu…

麒麟KylinServer的网站,并部署一套主从DNS服务器提供域名解析服务

一、KylinServer网站搭建 ifconfig Copy 注意:根据实际网卡设备名称情况调整代码!不同环境下网卡名称略有不同! 获取本机IP地址,记住IP地址用于之后的配置填写。 ifconfig enp0s2 Copy 下载nginx源码包,并解压缩 wget http://10.44.16.102:60000/allfiles/Kylin/ng…

解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件

勾选Auto-detect proxy setting并填入 https://plugins.jetbrains.com 代理URL&#xff0c;可以先做检查连接&#xff1a;

AWTK-WIDGET-WEB-VIEW 发布

awtk-widget-web-view 是通过 webview 提供的接口&#xff0c;实现的 AWTK 自定义控件&#xff0c;使得 AWTK 可以方便的显示 web 页面。 项目网址&#xff1a; https://gitee.com/zlgopen/awtk-widget-web-view webview 提供了一个跨平台的 webview 接口&#xff0c;是一个非…