【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.mfbz.cn/a/601772.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

风与水如何联合优化?基于混合遗传算法的风-水联合优化运行程序代码!

前言 为提高风电场的供电质量同时增加其发电效益,利用储能技术为风电场配置一个蓄能系统是比较重要的解决措施之一。风电的蓄能技术有水力蓄能、压缩空气蓄能、超导磁力蓄能、流体电池组、电解水制氢等,其中水力蓄能是技术较成熟的一种蓄能方式,且小型的…

给网站网页PHP页面设置密码访问代码

将MkEncrypt.php文件上传至你网站根目录下或者同级目录下。 MkEncrypt.php里面添加代码,再将调用代码添加到你需要加密的页进行调用 MkEncrypt(‘123456’);括号里面123456修改成你需要设置的密码。 密码正确才能进去页面,进入后会存下cookies值&…

项目经理【过程】概念

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 【环境】任务 【环境】绩效 【人】概述 【人】原则 【人】任务 【人】绩效 【过程】概念 一、过程是什么 1.1 项目管理五大过程组 1.2 五大过程组之间的相互作用 1.3 项目阶段VS过…

《Linux运维总结:ARM架构CPU基于docker-compose一离线部署consul v1.18.1集群工具》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统&…

【SpringBoot】-- 监听容器事件、Bean的前后置事件

目录 一、ApplicationContextInitializer 使用 1、自定义类,实现ApplicationContextInitializer接口 2、在META-INF/spring.factories配置文件中配置自定义类 二、ApplicationListener 使用 1、自定义类,实现ApplicationListener接口 2、在META-…

tensorboard子目录运行

tensorboard默认在根目录运行,浏览器访问127.0.0.1:6006打开界面。 如果想在子目录运行,那么可以这么执行 tensorboard --logdir ./logs --path_prefix/app/asd 然后浏览器既可以通过 http://localhost:6006/app/asd/来访问。​​​​​​ 但这么做遇…

HADOOP之YARN详解

目录 一、YARN的简介 1.1 MapReduce 1.x 1.1.1 MapReduce 1.x的角色 1.2 YARN的介绍 1.3 YARN的设计思想 二 YARN的配置 1. mapred-site.xml 2. yarn-site.xml ​编辑 3. hadoop-env.sh 4. 分发到其他节点 5.YARN的服务启停 6. 任务测试 三 YARN的历史日志 1. 历…

JetBrains的多数据库管理和SQL工具DataGrip 2024.1版本在Windows/Linux系统的下载与安装配置

目录 前言一、DataGrip在Windows安装二、DataGrip在Linux安装三、Windows下使用配置四、Linux下使用配置总结 前言 ​ “ DataGrip是一款多数据库管理和SQL工具,适用于不同类型的数据库。它提供了丰富的功能和工具,可以帮助开发人员更高效地管理数据库、…

【Linux网络编程】4.TCP协议、select多路IO转换

目录 TCP协议 TCP通讯时序 三次握手 四次挥手 滑动窗口 测试代码1 测试结果 Address already in use解决方法 批量杀进程 测试代码2 测试结果 测试代码4 测试结果 TCP状态转换 主动发起连接请求端 主动关闭连接请求端 被动接收连接请求端 被动关闭连接请求端…

浅谈自己用过最好用的AI工具概括

个人最经常用的AI工具的其实是Copilot,但是也有别的一些最好用的AI工具,包括: OpenAI GPT-3:这是一个自然语言生成模型,具有强大的语言理解和生成能力。它可以用于各种任务,如文字生成、自动回复和文本摘要…

1984. 学生分数的最小差值C++

给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。 从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。 返回可能的 最小差值 。 示例 1: 输入&…

台灯的十大品牌有哪些?十大护眼灯品牌推荐

相信细心的家长已经发现,自家孩子随着步入更高的年级,每天晚上学习的时间也越来越晚了,而这个过程中必然少不了一盏好的台灯! 市场上有不少网红代言的护眼灯,虽然它们销售量高,但其实缺乏专业技术和安全保障…

大数据Scala教程从入门到精通第三篇:Scala和Java的关系

一:Scala和Java的关系 1:详解 一般来说,学 Scala的人,都会 Java,而 Scala 是基于 Java 的,因此我们需要将 Scala和 Java 以及 JVM 之间的关系搞清楚,否则学习 Scala 你会蒙圈 Scala可以使用SDK…

【算法】基础算法004之前缀和

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 前言 本篇文章为大家带来前缀和…

推荐一个gpt全能网站

进入后,里面是这样的 点开后,里面是这样的 你以为只有这些吗? 往下翻一翻,你会发现新大陆!! 在输入框的下面,有一个分类栏,鼠标移上去,下面就会给出一堆网站 光是gp…

(超简单)SpringBoot中简单用工厂模式来实现

简单讲述业务需求 业务需要根据不同的类型返回不同的用户列表,比如按角色查询用户列表、按机构查询用户列表,用户信息需要从数据库中查询,因为不同的类型查询的逻辑不相同,因此简单用工厂模式来设计一下; 首先新建一个…

为什么 ChatGPT 不火了?

不火了是有原因的,下面我来从大部分人拿到 ChatGPT 之后的两大痛点开始讲起: 很多朋友拿到 ChatGPT 后的第一个痛点就是:用的不好 你经常会感觉到 ChatGPT 回答的好空,没有太多参考价值。 而第二个痛点则是:无处去用…

数据结构复习/学习9--堆/堆实现/升降序建堆/top-k问题

一、堆与完全二叉树 1.堆的逻辑与物理结构 2.父节点与子节点的下标 3.大小根堆 二、堆的实现(大根堆为例) 注意事项总结: 注意堆中插入与删除数据的位置和方法与维持大根堆有序时的数据上下调整 三、堆排序 1.排升序建大堆效率高 注意事项…

Android 开机启动扫描SD卡apk流程源码分析

在开机的时候,装在SD卡的apk和装在系统盘的apk扫描过程不一样,系统盘apk在系统启动过程中扫描,而SD卡上的就不是,等系统启动好了才挂载、扫描,下面就说下SD扫描的流程: 在SystemServer启动MountService&am…

Golang | Leetcode Golang题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; func searchMatrix(matrix [][]int, target int) bool {m, n : len(matrix), len(matrix[0])i : sort.Search(m*n, func(i int) bool { return matrix[i/n][i%n] > target })return i < m*n && matrix[i/n][i%n] target }
最新文章