笔记:《利用Python进行数据分析》之透视表和交叉表

news2024/11/25 16:23:07

透视表和交叉表

透视表(pivot table)是各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中。在Python和pandas中,可以通过本章所介绍的groupby功能以及(能够利用层次化索引的)重塑运算制作透视表。DataFrame有一个pivot_table方法,此外还有一个顶级的pandas.pivot_table函数。除能为groupby提供便利之外,pivot_table还可以添加分项小计,也叫做margins。

回到小费数据集,假设我想要根据day和smoker计算分组平均数(pivot_table的默认聚合类型),并将day和smoker放到行上:

In [130]: tips.pivot_table(index=['day', 'smoker'])
Out[130]: 
                 size       tip   tip_pct  total_bill
day  smoker                                          
Fri  No      2.250000  2.812500  0.151650   18.420000
     Yes     2.066667  2.714000  0.174783   16.813333
Sat  No      2.555556  3.102889  0.158048   19.661778
     Yes     2.476190  2.875476  0.147906   21.276667
Sun  No      2.929825  3.167895  0.160113   20.506667
     Yes     2.578947  3.516842  0.187250   24.120000
Thur No      2.488889  2.673778  0.160298   17.113111
     Yes     2.352941  3.030000  0.163863   19.190588

可以用groupby直接来做。现在,假设我们只想聚合tip_pct和size,而且想根据time进行分组。我将smoker放到列上,把day放到行上:

In [131]: tips.pivot_table(['tip_pct', 'size'], index=['time', 'day'],
   .....:                  columns='smoker')
Out[131]: 
                 size             tip_pct          
smoker             No       Yes        No       Yes
time   day                                         
Dinner Fri   2.000000  2.222222  0.139622  0.165347
       Sat   2.555556  2.476190  0.158048  0.147906
       Sun   2.929825  2.578947  0.160113  0.187250
       Thur  2.000000       NaN  0.159744       NaN
Lunch  Fri   3.000000  1.833333  0.187735  0.188937
       Thur  2.500000  2.352941  0.160311  0.163863

还可以对这个表作进一步的处理,传入margins=True添加分项小计。这将会添加标签为All的行和列,其值对应于单个等级中所有数据的分组统计:

In [132]: tips.pivot_table(['tip_pct', 'size'], index=['time', 'day'],
   .....:                  columns='smoker', margins=True)
Out[132]: 
                 size                       tip_pct                    
smoker             No       Yes       All        No       Yes       All
time   day                                                             
Dinner Fri   2.000000  2.222222  2.166667  0.139622  0.165347  0.158916
       Sat   2.555556  2.476190  2.517241  0.158048  0.147906  0.153152
       Sun   2.929825  2.578947  2.842105  0.160113  0.187250  0.166897
       Thur  2.000000       NaN  2.000000  0.159744       NaN  0.159744
Lunch  Fri   3.000000  1.833333  2.000000  0.187735  0.188937  0.188765
       Thur  2.500000  2.352941  2.459016  0.160311  0.163863  0.161301
All          2.668874  2.408602  2.569672  0.159328  0.163196  0.160803

这里,All值为平均数:不单独考虑烟民与非烟民(All列),不单独考虑行分组两个级别中的任何单项(All行)。

要使用其他的聚合函数,将其传给aggfunc即可。例如,使用count或len可以得到有关分组大小的交叉表(计数或频率):

In [133]: tips.pivot_table('tip_pct', index=['time', 'smoker'], columns='day',
   .....:                  aggfunc=len, margins=True)
Out[133]: 
day             Fri   Sat   Sun  Thur    All
time   smoker                               
Dinner No       3.0  45.0  57.0   1.0  106.0
       Yes      9.0  42.0  19.0   NaN   70.0
Lunch  No       1.0   NaN   NaN  44.0   45.0
       Yes      6.0   NaN   NaN  17.0   23.0
All            19.0  87.0  76.0  62.0  244.0

如果存在空的组合(也就是NA),你可能会希望设置一个fill_value:

In [134]: tips.pivot_table('tip_pct', index=['time', 'size', 'smoker'],
   .....:                  columns='day', aggfunc='mean', fill_value=0)
Out[134]: 
day                      Fri       Sat       Sun      Thur
time   size smoker                                        
Dinner 1    No      0.000000  0.137931  0.000000  0.000000
            Yes     0.000000  0.325733  0.000000  0.000000
       2    No      0.139622  0.162705  0.168859  0.159744
            Yes     0.171297  0.148668  0.207893  0.000000
       3    No      0.000000  0.154661  0.152663  0.000000
            Yes     0.000000  0.144995  0.152660  0.000000
       4    No      0.000000  0.150096  0.148143  0.000000
            Yes     0.117750  0.124515  0.193370  0.000000
       5    No      0.000000  0.000000  0.206928  0.000000
Yes     0.000000  0.106572  0.065660  0.000000
...                      ...       ...       ...       ...
Lunch  1    No      0.000000  0.000000  0.000000  0.181728
            Yes     0.223776  0.000000  0.000000  0.000000
       2    No      0.000000  0.000000  0.000000  0.166005
            Yes     0.181969  0.000000  0.000000  0.158843
       3    No      0.187735  0.000000  0.000000  0.084246
            Yes     0.000000  0.000000  0.000000  0.204952
       4    No      0.000000  0.000000  0.000000  0.138919
            Yes     0.000000  0.000000  0.000000  0.155410
       5    No      0.000000  0.000000  0.000000  0.121389
       6    No      0.000000  0.000000  0.000000  0.173706
[21 rows x 4 columns]

表10-2 pivot_table的选项

交叉表:crosstab

交叉表(cross-tabulation,简称crosstab)是一种用于计算分组频率的特殊透视表。看下面的例子:

In [138]: data
Out[138]:
   Sample Nationality    Handedness
0       1         USA  Right-handed
1       2       Japan   Left-handed
2       3         USA  Right-handed
3       4       Japan  Right-handed
4       5       Japan   Left-handed
5       6       Japan  Right-handed
6       7         USA  Right-handed
7       8         USA   Left-handed
8       9       Japan  Right-handed
9      10         USA  Right-handed

作为调查分析的一部分,我们可能想要根据国籍和用手习惯对这段数据进行统计汇总。虽然可以用pivot_table实现该功能,但是pandas.crosstab函数会更方便:

In [139]: pd.crosstab(data.Nationality, data.Handedness, margins=True)
Out[139]: 
Handedness   Left-handed  Right-handed  All
Nationality
Japan                  2             3    5
USA                    1             4    5
All                    3             7   10

crosstab的前两个参数可以是数组或Series,或是数组列表。就像小费数据:

In [140]: pd.crosstab([tips.time, tips.day], tips.smoker, margins=True)
Out[140]: 
smoker        No  Yes  All
time   day                
Dinner Fri     3    9   12
       Sat    45   42   87
       Sun    57   19   76
       Thur    1    0    1
Lunch  Fri     1    6    7
       Thur   44   17   61
All          151   93  244

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

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

相关文章

代码随想录算法训练营第十八天| 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

今日内容 leetcode. 669 修剪二叉搜索树leetcode. 108 将有序数组转换为二叉搜索树leetcode. 538 把二叉搜索树转换为累加树 Leetcode. 669 修剪二叉搜索树 文章链接:代码随想录 (programmercarl.com) 题目链接:669. 修剪二叉搜索树 - 力扣&#xff08…

mathtype批量更改公式编号的格式

这是一个笔记 在使用的时候遇到的问题,经过研究发现mathtype生成的右编号公式可以批量更新 调整前 如图,如果调整前使用的是默认的编号格式,显示为 1.5 1.5 1.5: 这里面1和5的意义为: 1:节编号5:公式编号 如下:调整后 如果需要不按章节形式来分类,则可以通过以下…

大数据中心运营管理整体规划方案(32页PPT)

随着信息技术的飞速发展,大数据已成为推动产业升级、促进经济社会发展的重要力量。大数据中心作为数据存储、处理与分析的核心基础设施,其运营管理的规范化、高效化、智能化直接关系到数据价值的有效挖掘和企业的核心竞争力。大数据中心运营管理整体规划…

免费下载Win11 24H2专业版!附详细安装教程

今日,系统之家小编给大家带来2024年最新的Windows11 24H2专业版系统,更新后系统版本号将升至26100.1591。系统基于微软官方最新Windows 11 24H2专业版进行离线制作与优化,确保系统安全无毒,兼容性强,可完美支持新老机型…

构建可扩展的数据平台(数据平台设计中的数据网格趋势)

添加图片注释,不超过 140 字(可选) 欢迎来到雲闪世界。在本文中,我旨在深入研究各种类型的数据平台架构,更好地了解它们的演变、优势、劣势和实际应用。重点是数据网格架构、它在现代数据堆栈 (MDS) 中的作用以及当今…

Getting an error trying to import environment OpenAI Gym

题意:尝试导入 OpenAI Gym 环境时遇到错误 问题背景: I am trying to run an OpenAI Gym environment: 我正在尝试运行一个 OpenAI Gym 环境: env gym.make("ALE/Breakout-v5", render_mode"rgb_array")But I get th…

数据分析-MAC 编程环境安装教程

目标 在 Mac 电脑上,安装以下环境: 1. 安装 Anaconda:用于管理 Python 及其依赖库的分发,适用于数据科学和机器学习。 2. 安装 chromedriver:用于 Selenium 自动化测试,尤其是与 Google Chrome 浏览器的…

【爬虫软件】YouTube关键词搜索采集工具

我用Python开发的油管关键词搜索批量采集软件。 软件界面: 采集结果demo数据: 演示视频: https://www.bilibili.com/video/BV1uz421m7JA 完整讲解: https://www.bilibili.com/read/cv34407726

Redis高级-----持久化AOF、RDB原理

目前已更新系列: 当前:Redis高级-----持久化AOF、RDB原理 Redis高级---面试总结5种数据结构的底层实现 Redis高级----主从、哨兵、分片、脑裂原理-CSDN博客 Redis高级---面试总结内存过期策略及其淘汰策略 计算机网络--面试知识总结一 计算机网络-…

3.数据结构-c/c++实现栈(详解,栈容量可以动态增长)

一.栈的基本介绍 栈是一种只能够在一端进行插入和删除的顺序表。如下图 空栈:表示不含任何元素的栈 栈顶:表示允许进行插入和删除元素的一端 栈底:表示不允许进行插入和删除元素的一端 即栈是一种后进先出的线性表数据结构 二.栈的常见操…

尚硅谷Vue入门视频 笔记

尚硅谷视频:https://www.bilibili.com/video/BV1Zy4y1K7SH/?spm_id_from333.999.0.0&vd_sourcecec13bbe100bddfff8baf29d18ed8994 文章目录 模板语法data与el的2种写法MVVM模型事件事件修饰符事件的基本使用 计算属性简写形式 监视属性绑定样式条件渲染列表渲…

多线程篇(可见性 原子性 有序性(可见性))(持续更新迭代)

目录 一、volatile(关键字)(并发编程之美) 1. 前言 2. synchronized与volatile关键字对比 3. 什么时候使用volatile关键字 二、volatile(关键字)(深入理解JVM第三版) 1. 前言 …

儿童护眼灯哪个牌子好?家长必看这些眼科医生推荐的台灯

如今,学生们经常长时间使用平板电脑、手机和电脑等电子设备,这些设备的屏幕会产生频闪和蓝光辐射,进而影响视力健康。因此,护眼成为了家长们普遍关心的问题。视力疲劳和眼部疾病不仅会影响个人的生活质量,还可能引发长…

申请超长期IP地址SSL证书

随着互联网技术的不断发展,信息安全成为了企业和个人关注的核心议题之一。SSL证书不仅能够加密网站的通信数据,保护用户隐私,还能增强网站的可信度,提升搜索引擎排名等。通常情况下,SSL证书是绑定到域名上的&#xff0…

09--kubernetes持久化存储和StatefulSet控制器

前言:本章是k8s持久化存储的详细笔记,由持久化引申出来的statefulset控制器和无头svc都会在本章有详细记录。 1、K8s持久化存储PV和PVC 在前面文章已经使用卷挂载的方式将pod文件持久化保存在宿主机中,但实际工作中pod往往会以多副本形式存…

骨传导耳机哪个牌子最好?今天安利五款好口碑骨传导耳机!

基于对运动耳机多年的使用和深入研究,我想传达几个朴素却重要的观点:购买前请三思,避免盲目追求潮流。虽然网络上的热门款式引人瞩目,但它们的热度可能转瞬即逝;而高价位的知名品牌耳机,虽然品质有保证&…

SpringBoot整合Thymleaf实现页面静态化

1. 问题需求分析 在做乐优商城时,页面是通过Thymeleaf模板引擎渲染后返回到客户端。当商品详情页数据渲染时,在后台需要大量的数据查询,而后渲染得到HTML页面。在用户访问量大的情况下会对数据库造成压力,并且请求的响应时间过长…

开放式耳机与入耳式耳机相比,有哪些优劣势?权威推荐5个实用好用品牌

​开放式耳机其实相对于入耳式耳机来说区别还是比较大的。开放式耳机现在超火,它们不塞进耳朵,这样长时间戴着耳朵也不会难受,还能保护耳朵卫生,特别受爱运动和喜欢研究耳机的朋友们欢迎。不过市面上的开放式耳机太多了&#xff0…

glsl着色器学习(三)

前面两篇文章已经创建好了顶点着色器和片段着色器并编译成功,下面将创建program(程序),将着色器链接起来 创建Program const prg gl.createProgram(); gl.attachShader(prg, vertexShader); gl.attachShader(prg, fragmentShader); gl.linkProgram(pr…

【无标题】docker-compose一键部署项目,haproxy容器代理多个web或java容器

# 创建脚本,可以在java环境中运行任何的jar包或者war包#!/bin/bash/usr/local/jdk/bin/java -jar /java/src/*.?ar 一、思路分析: (1)nginx 1、下载镜像,将本地的dist项目的目录挂载在容器的/usr/share/nginx/html/ …