【python数据分析基础】—pandas透视表和交叉表

目录

  • 前言
  • 一、pivot_table 透视表
  • 二、crosstab 交叉表
  • 三、实际应用


前言

透视表是excel和其他数据分析软件中一种常见的数据汇总工具。它是根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中。


一、pivot_table 透视表

pivot_table()默认显示指定索引列和所有数值列。

语法:

pivot_table(data: ‘DataFrame’, values=None, index=None, columns=None, aggfunc: ‘AggFuncType’ = ‘mean’, fill_value=None, margins: ‘bool’ = False, dropna: ‘bool’ = True, margins_name: ‘str’ = ‘All’, observed: ‘bool’ = False, sort: ‘bool’ = True)

参数解析:

  • data:dataframe数据框。
  • value:需要聚合的列的名称,可选。默认聚合所有数值列。
  • index:用于分组的列名或其他分组键,出现在结果透视表的行。
  • columns:用于分组的列名或其他分组键,出现在结果透视表的列。
  • aggfunc:聚合函数或函数列表,默认为"mean",可以是任何对groupby有效的函数。
  • fill_value:用于替换结果表中的缺失值。
  • margins:添加行/列小计和总计,默认为False。
  • dropna:不聚合所有值都为NA的列,默认为True。
  • margins_name:如果margins=True,设置添加行/列小计和总计的名称,默认为"All"。

举例:

以小费数据集为例,数据情况如下:

import pandas as pd
tips=pd.read_csv('F:\\pydata-book-2nd-edition\\examples\\tips.csv')
tips["tip_pct"]=tips["tip"]/tips["total_bill"] #添加一列小费比例tip_pct
tips.head(10)

在这里插入图片描述

tips.shape # (244, 8)
tips.columns

在这里插入图片描述

参数index:根据sex和smoker计算分组平均数。

#pivot_table的默认聚合类型:平均数
tips.pivot_table(index=['sex ','smoker'])

在这里插入图片描述

参数values和columns:只想聚合"tip_pct"和"size",根据"sex","day"分组,将"smoker"放到列上,"day"放到行上。

tips.pivot_table(['tip_pct','size'],index=['sex ','day'],columns='smoker')

在这里插入图片描述

参数margins:margins=True 添加分项小计,这将会添加标签为all的行和列,其值对应单个等级中所有数据的分组统计,all值为平均值。

tips.pivot_table(['tip_pct','size'],index=['sex ','day'],columns='smoker',margins=True)

在这里插入图片描述

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

tips.pivot_table('tip_pct',index=['sex ','smoker'],columns='day',aggfunc=len,margins=True)

在这里插入图片描述

参数fill_value:fill_value可以填补空值(NA)

tips.pivot_table('size',index=['time','sex ','smoker'],columns='day',aggfunc='sum',fill_value=0)

在这里插入图片描述


二、crosstab 交叉表

交叉表作为一种特殊的透视表,用于计算分组频率的特殊透视表。

语法:

crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins: ‘bool’ = False, margins_name: ‘str’ = ‘All’, dropna: ‘bool’ = True, normalize=False)

参数解析:

  • index:接收string、数组、Series或数组list,表示行索引键,无默认。
  • columns:接收string、数组、Series或数组list,表示列索引键,无默认。
  • values:接收array,表示聚合数据,置信为None。
  • rownames:表示行分组键名,无默认。
  • colnames:表示列分组键名,无默认。
  • aggfunc:接收function,表示聚合函数,默认为None。
  • margins:布尔值,默认为True。表示汇总(total)功能的开关,设置为True后,结果集中会出现名为"ALL"的行和列。
  • margins_name:设置总计行(列)的名称(默认名称是“All”)
  • dropna:布尔值,表示是否对值进行标准化,默认为False。
  • normalize:布尔值,表示是否对值进行标准化,默认为False。

举例:

import numpy as np
data = pd.DataFrame({"Sample":np.arange(10),"Gender":np.random.choice(("Female","Male"),10),"Handedness":np.random.choice(("Right-handed","Left-handed"),10)})
data

在这里插入图片描述

根据性别和用手习惯对这段数据进行统计汇总。

import pandas as pd
pd.crosstab(data["Gender"],data["Handedness"],margins=True)

在这里插入图片描述


三、实际应用

示例1:数据聚合与分组实际应用

数据集情况:

import pandas as pd
fec=pd.read_csv('F:\\pydata-book-2nd-edition\\datasets\\fec\\P00000001-ALL.csv')
fec.shape #(1001731, 16)
fec.columns

在这里插入图片描述

fec.iloc[123456]

在这里插入图片描述

  • 分析1: 获取全部的候选人的名单
uniques_cands=fec.cand_nm.unique()
uniques_cands
uniques_cands[2]

在这里插入图片描述

  • 分析2: 补充党派信息

第一步:利用字典说明党派关系。

parties={'Bachmann, Michelle':'Republican','Romney, Mitt':'Republican', 'Obama, Barack':'Democrat',"Roemer, Charles E. 'Buddy' III":'Republican','Pawlenty, Timothy':'Republican','Johnson, Gary Earl':'Republican','Paul, Ron':'Republican', 'Santorum, Rick':'Republican','Cain, Herman':'Republican', 'Gingrich, Newt':'Republican','McCotter, Thaddeus G':'Republican','Huntsman, Jon':'Republican','Perry, Rick':'Republican'}

第二步:通过映射以及series对象的map方法,你可以根据候选人姓名得到一组党派信息,将其添加一个新列。

fec['party']=fec.cand_nm.map(parties)
fec['party'].value_counts()

在这里插入图片描述

数据集中“contb_receipt_amt”既包括退款也包括赞助,因此限定数据集只有正的出资额。

(fec["contb_receipt_amt"]>0).value_counts()

在这里插入图片描述

fec=fec[fec["contb_receipt_amt"]>0]
  • 分析3: 根据职业和雇主统计赞助信息

第一步:根据职业计算出资总额。

fec["contbr_occupation"].value_counts()[:10]

在这里插入图片描述

第二步:对职业信息、雇主信息进行映射。

occ_mapping={'INFORMATION REQUESTED':'NOT PROVIDED','INFORMATION REQUESTED PER BEST EFFORTS':'NOT PROVIDED','INFORMATION REQUESTED(BEST EFFORTS)':'NOT PROVIDED','C.E.O':'CEO'}#如果没有映射消息则返回x
f=lambda x:occ_mapping.get(x,x)
fec["contbr_occupation"]=fec["contbr_occupation"].map(f)
emp_mapping={'INFORMATION REQUESTED':'NOT PROVIDED','INFORMATION REQUESTED PER BEST EFFORTS':'NOT PROVIDED','SELF':'SELF-EMPLOYED','SELF EMPLOYED':'SELF-EMPLOYED'}f=lambda x:emp_mapping.get(x,x)
fec["contbr_employer"]=fec["contbr_employer"].map(f)

第三步:根据党派和职业对数据进行聚合,过滤掉总出资额不足200万美元的数据,生成透视表。

by_occupation = pd.pivot_table(fec,values='contb_receipt_amt',index='contbr_occupation',columns='party',aggfunc="sum")

第四步:生成柱状图

over_2mm = by_occupation[by_occupation.sum(1)>2000000]
over_2mm
over_2mm.plot(kind='barh')

在这里插入图片描述

  • 分析4: 总出资额最高的职业和企业

求最大值方法

def get_top_amounts(group,key,n=5):totals=group.groupby(key)['contb_receipt_amt'].sum()return totals.sort_values(ascending=False)[n:] #根据key对totals进行降序排列

根据职业和雇主进行聚合

fec_mrbo=fec[fec['cand_nm'].isin(['Obama, Barack','Romney, Mitt'])]grouped=fec_mrbo.groupby('cand_nm')grouped.apply(get_top_amounts,'contbr_occupation',n=7)#get_top_amounts函数的参数值

在这里插入图片描述

grouped.apply(get_top_amounts,'contbr_employer',n=10)

在这里插入图片描述

  • 分析5: 对出资额分组

第一步:利用cut函数根据出资额大小将数据离散到多个面元中。

bins=np.array([0,10,100,1000,10000,100000,1000000,10000000,100000000])
labels=pd.cut(fec_mrbo.contb_receipt_amt,bins)
labels

在这里插入图片描述

第二步:根据候选人的姓名以及面元标签对数据进行分组。

grouped=fec_mrbo.groupby(['cand_nm',labels])
grouped.size().unstack(0)

在这里插入图片描述

可以看到obama在小额赞助的数量比romney多得多。

第三步:对出资额求和并在面元内规格化,以便图形化显示两位候选人各种赞助额度的比例:

bucket_sums=grouped.contb_receipt_amt.sum().unstack(0)
bucket_sums

在这里插入图片描述

数据按行求频率如下:

normed_sums=bucket_sums.div(bucket_sums.sum(axis=1),axis=0)
normed_sums

在这里插入图片描述

两位候选人收到的各种捐赠额度的总额比例:

normed_sums[:-2].plot(kind='barh',stacked=True) #排除了两具最大的面元。

在这里插入图片描述

  • 分析6: 根据州统计赞助信息

第一步:根据候选人和州对数据进行聚合。

grouped=fec_mrbo.groupby(['cand_nm','contbr_st'])
totals=grouped.contb_receipt_amt.sum().unstack(0).fillna(0)
totals=totals[totals.sum(1)>100000]
totals[:10]

在这里插入图片描述

第二步:对各行除以总赞助额,就会得到各候选人在各州的总赞助额比例。

percent=totals.div(totals.sum(1),axis=0)
percent[:10]

在这里插入图片描述

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

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

相关文章

【MySQL】MySQL基本知识点

目录 1.SQL分类: 2.DDL-数据库操作 3.DDL-表操作-创建 4.DDL-表操作-查询 5.DDL-表操作-数据类型 6.DDL-表操作-修改 1.SQL分类: 2.DDL-数据库操作 3.DDL-表操作-创建 注意:里面的符号全部要切换为英文状态 4.DDL-表操作-查询 5.DDL…

车路云一体化简介

车路云一体化 车路云一体化融合控制系统( System of Coordinated Control by Vehicle-Road-Cloud Integration,SCCVRCI),是利用新一代信息与通信技术, 将人、车、路、云的物理层、信息层、应用层连为一体,…

Linux网络编程(三)IO复用二 poll系统调用

二、poll系统调用 2.1、API poll系统调用和select类似&#xff0c;也是在指定时间内轮询一定数量的文件描述符&#xff0c;以测试其中是否有就绪者。 #include <poll.h>int poll(struct pollfd* fds, nfds_t nfds, int timeout);fds参数是一个pollfd结构类型的数组&am…

切实有效的提高VMWARE游戏性能-各版本通杀 vm17pro

这里的游戏性能&#xff0c;当然了&#xff0c;特别指出的是3D性能&#xff0c;毕竟现在2D也很少了。 因为平时没啥事&#xff0c;所以&#xff0c;无聊就跟朋友挂挂游戏&#xff0c;没事写点代码折腾下。所以&#xff0c;免不了跟VMWARE搭上边。走了很多的弯路&#xff0c;中…

使用动态种子的DGA:DNS流量中的意外行为

Akamai研究人员最近在域名系统&#xff08;DNS&#xff09;流量数据中观察到&#xff1a;使用动态种子的域名生成算法&#xff08;Domain Generation Algorithm&#xff0c;DGA&#xff09;的实际行为&#xff0c;与对算法进行逆向工程推测的预期行为之间存在一些差异。也就是说…

Android 系统启动流程源码分析

一、Init进程启动 是一个由内核启动的用户级进程。内核自行启动之后&#xff0c;就通过启动一个用户级程序init的方式&#xff0c;完成引导进程。 启动的代码init.c中的main函数执行过程&#xff1a;system\core\init.c中&#xff1a; 主要下面两个重要的过程&#xff1a; 1…

批量将GOID转成GO term名并添加BP,MF,CC分类信息

基因本体论&#xff08;Gene Ontology&#xff0c;GO&#xff0c;https://www.geneontology.org&#xff09;是一个广泛应用于生物信息学领域的知识库&#xff0c;它提供了一套标准化的词汇和分类体系&#xff0c;用于描述基因功能、细胞组分和生物过程。GO旨在统一科研人员对基…

无人机+垂直起降:微型共轴双旋翼无人机技术详解

微型共轴双旋翼无人机技术是一种独特的无人机设计&#xff0c;它结合了垂直起降&#xff08;VTOL&#xff09;能力和微型无人机的灵活性。这种设计允许无人机在无需跑道的情况下垂直起降&#xff0c;并具备在空中悬停和执行各种飞行动作的能力。 适用于集群控制&#xff0c;荷载…

NXP i.MX8系列平台开发讲解 - 1.1 导读前言

专栏文章目录传送门&#xff1a;返回专栏目录 文章目录 目录 1. 本专辑介绍 2. 学习本专辑作用 3.关于作者 1. 本专辑介绍 本专辑将会介绍Linux 驱动开发&#xff0c;Android BSP 驱动涉及HAL层调试&#xff0c;适用于嵌入式软件开发人员&#xff0c;和有兴趣向该方向发展…

基于单片机的无线数据传输系统设计

摘要:基于单片机的无线数据传输系统的设计,实现了温度和湿度的自动采集、无线通讯和报警功能。该系统包括了LCD1602显示电路、DHT11温湿度采集电路等,完成了基于无线数据传输的方法来实现温湿度的采集。 关键词:温湿度检测;N RF 24 L 01;单片机 0 引言 随着科技水平的提高,…

五一 大项目

Docker 中的 Nginx 服务为什么要启用 HTTPS 一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos…

前端实现导入Excel进行数据展示、导出

需求 一个 excel 文档 需要对文档里面的数据进行筛选拆分重组 由于数据量巨大 后端又抽不出来手 于是使用纯前端解决方案 解决思路 前端导入excel 把 excel 的数据解析为 json 格式 对数据进行相应操作后 重新导出为新 excel 虽笨但有效 第一步 导入excel 该方案需引…

Promise魔鬼面试题

文章目录 题目解析难点分析分析输出step1step2step3step4step5step6 参考/致谢&#xff1a;渡一袁老师 题目 Promise.resolve().then(() > {console.log(0);return Promise.resolve(4);}).then((res) > {console.log(res);});Promise.resolve().then(() > {console.l…

spark sql 与scala混合开发实现数据入mongodb

目录 概述资源解决问题效果环境配置相关包关键代码 测试测试结果 概述 在此提供 spark sql 与scala混合开发实现数据入mongodb 相关思路 将部分重复性功能进行通用化(使用SQL与Scala混合开发模式)。 相关组件 hadoop 3.3.6 spark 3.4.2 kyuubi 1.8.0 基于上术组件开发 资源 …

uniapp video 层级覆盖

层级覆盖 cover-view组件 我这里做了个判断 监听全屏时隐藏按钮 根据项目需求自行更改

2024.5.6 关于 SpringCloud 的基本认知

目录 引言 微服务框架所包含的技术栈 微服务架构演变 单体架构 分布式架构 微服务架构 微服务技术对比 认识 SpringCloud SpringBoot 版本兼容关系 服务拆分和远程调用 服务拆分注意事项 远程调用 引言 微服务是一种框架风格&#xff0c;按照业务板块来划分应用代码…

微信小程序(Taro)获取经纬度并转化为具体城市

1、获取经纬度 申请权限&#xff0c;想要使用微信小程序获取经纬度的方法是要申请该方面的权限。 获取经纬度的方法有很多选择其中一个使用就好。 我使用的是Taro.getFuzzyLocation(&#xff09; 在app.config.js中需要添加设置 requiredPrivateInfos: ["getFuzzyLocat…

群晖上部署农场管理系统farmOS

什么是 farmOS &#xff1f; farmOS 是一个基于 Web 的应用程序&#xff0c;用于农场管理、规划和记录保存。它由志愿者社区开发&#xff0c;旨在为农民、开发人员和研究人员提供一个标准平台。 需要注意的是&#xff0c;群晖内核版本太低会遇到下面的错误&#xff0c;这个 AH0…

高实时、高可靠的微内核操作系统——鸿道Intewell

近年来&#xff0c;我国不断推进工业转型升级&#xff0c;力求实现从传统工业大国向现代工业强国的跨越。想要在新一轮科技革命中“超车”&#xff0c;需要从多个维度进行深度布局和全面发力。 ——科技创新是核心驱动力 积极推动工业结构的优化和升级&#xff0c;通过发展新…

vue脚手架和vite创建的项目的环境配置

开发环境文件 .env.development NODE_ENV"development" # // 开发接口域名 本地测试就用这个 # vue脚手架创建的 VUE_APP_MODE"开发环境" VUE_APP_API_URL http://19527 # vite创建的 # VITE_MODE"开发环境" # VITE_BASE_URL http://1920:9527…