[Pandas] 创建透视表与交叉表

news2024/11/24 4:38:08

1.生成透视表

在使用Python处理数据时,我们希望能够快速地进行排列与计算数据,从而帮助我们更有效的分析数据,pivot_table函数可以实现Excel数据透视表的功能

基本语法格式

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

参数说明

参数描述
data需要透视的DataFrame对象
values需要聚合的字段(一个或多个)
index在数据透视表的索引上进行分组的列
columns在数据透视表的列上进行分组的列
aggfunc用于聚合的函数,默认是平均数mean
fill_value指定值来填充数据透视表的缺失值
margins布尔值,默认值为False,对所有的行/列进行汇总
dropna布尔值,默认值为True,当某一列全为NULL值时,dropna=True时删除该列,否则保留
margins_name指定汇总行/列的名称

导入数据

import pandas as pd

df = pd.DataFrame({
        'A':['a1', 'a1', 'a1', 'a2', 'a2', 'a2'],
        'B':['b2', 'b2', 'b1', 'b1', 'b1', 'b1'],
        'C':['c1', 'c1', 'c2', 'c2', 'c1', 'c1'],
        'D':[1, 2, 3, 4, 5, 6]})

df

'''
A  a1  a2
D   2   5
'''
pd.pivot_table(df,columns=['A'])

'''
    D
A    
a1  2
a2  5
'''
pd.pivot_table(df,index=['A'])

pivot_table()默认的算法是取平均值,columns=['A']用于将原df中A列的去重值作为数据透视表的字段列,index=['A']用于将原df中A列的去重值作为数据透视表的索引

res1 = pd.pivot_table(df, index='A', columns='B', values='D')

res1

我们以(a1,b1)进行计算来源分析

'''
    A   B   C  D
2  a1  b1  c2  3
'''
df.loc[(df.A=='a1') & (df.B=='b1')]

# 对D列求平均数
# 3.0
df.loc[(df.A=='a1') & (df.B=='b1')].D.mean()

筛选A列值为'a1'且B列值为'b1'的数据行,并对该数据行的D列求平均数,最终得到的结果为3.0,res1其他位置上的计算推导类似

import numpy as np

res2 = pd.pivot_table(df, index=['A','B'], columns=['C'], 
                      values='D', aggfunc=np.sum, fill_value=0,
                      margins=True)

'''
C       c1  c2  All
A   B              
a1  b1   0   3    3
    b2   3   0    3
a2  b1  11   4   15
All     14   7   21
'''
print(res2)

res2

index=['A','B'] 指定多个索引,aggfunc=np.sum 指定聚合方法为求和,fill_value=0 指定聚合为空的值为0,margins=True 增加行列汇总

import numpy as np

res3 = pd.pivot_table(df, index=['A','B'], columns=['C'], 
                      values='D', aggfunc=[np.mean,np.sum])

'''
      mean        sum     
C       c1   c2    c1   c2
A  B                      
a1 b1  NaN  3.0   NaN  3.0
   b2  1.5  NaN   3.0  NaN
a2 b1  5.5  4.0  11.0  4.0
'''
print(res3)

res3

aggfunc=[np.mean,np.sum] 指定聚合方法为求平均值以及求和,即我们可以使用aggfunc参数添加多个计算方法

如果DataFrame有多个数据列,我们也可以为每一个列指定不同的计算方法

导入数据 

import pandas as pd
import numpy as np

df1 = pd.DataFrame({
        'A':['a1', 'a1', 'a1', 'a2', 'a2', 'a2'],
        'B':['b2', 'b2', 'b1', 'b1', 'b1', 'b1'],
        'C':['c1', 'c1', 'c2', 'c2', 'c1', 'c1'],
        'D':[1, 2, 3, 4, 5, 6],
        'E':[7, 8, 9, 10, 11, 12]})

# D列求平均值,E列求和
res4 = pd.pivot_table(df1, index=['A','B'], columns=['C'], 
                      aggfunc={'D':np.mean, 'E':np.sum})

'''
         D          E      
C       c1   c2    c1    c2
A  B                       
a1 b1  NaN  3.0   NaN   9.0
   b2  1.5  NaN  15.0   NaN
a2 b1  5.5  4.0  23.0  10.0
'''
print(res4)

df1

res4 

最终形成的res4数据,D列求平均,E列求和 ​

2.生成交叉表

交叉表(cross tabulation)是用于统计分组频率的特殊透视表

交叉表就是将两列或多列中不重复的元素组成一个新的DataFrame,新数据的行和列交叉部分的值为其组合在原数据中的数量

基本语法格式

pd.crosstab(index, columns, values=None, 
            rownames=None, colnames=None, aggfunc=None,
            margins=False, margins_name='All',
            dropna=True, normalize=False)

参数说明

参数描述
index传入列,如df['A'],作为新数据的索引,新数据的索引为传入列的去重值
columns传入列,如df['A'],作为新数据的列,新数据的列为传入列的去重值
values传入列,根据此列的数值进行计算,计算方法取aggfunc参数指定的方法
rownames为新数据index起名,一个序列,默认值为None,必须与传递的行数、组数匹配
colnames为新数据columns起名,一个序列,默认值为None,必须与传递的列数、组数匹配
aggfunc函数,values列计算使用的计算方法
margins布尔值,默认值为False,对所有的行/列进行汇总
margins_name指定汇总行/列的名称
dropna布尔值,默认值为True,当某一列全为NULL值时,dropna=True时删除该列,否则保留
normalize{ 'all', 'index', 'columns' } 或 { True, False },默认值为False,通过将对应值除以所有值的总和进行归一化

导入数据

import pandas as pd

# 原数据
df = pd.DataFrame({
        'A':['a1','a1','a2','a2','a1'],
        'B':['b2','b1','b2','b2','b1'],
        'C':[1,2,3,4,5]})

df

res1 = pd.crosstab(index=df['A'], columns=df['B'])

res1

A和B两列进行交叉,A列去重有a1和a2两个值,B列去重有b1和b2两个值。交叉后组成了新的数据,索引分别是a1和a2,列分别为b1和b2,它们交叉位上对应的值为此组合的数量,如(a1,b1)组合有2个,所以它们的交叉位上的值为2; (a1,b2)组合有1个,所以它们的交叉位上的值为1; 没有(a2,b1)组合,所以它们的交叉位上的值为0; (a2,b2)组合有2个,所以它们的交叉位上的值为2 

import numpy as np
# 用aggfunc指定聚合方法对values指定的列进行计算 
res2 = pd.crosstab(index=df['A'], columns=df['B'], 
                   values=df['C'], aggfunc=np.sum)

res2

上述是对A列和B列进行交叉,按C列的值进行求和聚合

我们以(a1,b1)交叉位进行计算来源分析,在原来的df中,(a1,b1)组合有2个,对应C列值相加的和为7,故(a1,b1)交叉位值为7,其余交叉位计算类似

import numpy as np
# 交叉表,增加汇总
res3 = pd.crosstab(index=df['A'], columns=df['B'], 
                   values=df['C'], aggfunc=np.sum,
                   margins=True, margins_name='Total')

res3

margins=True可以增加行和列的汇总,按照行列方向对数据进行求和

margins_name='Total'可以定义这个汇总行和汇总列的名称 

'''
B   b1  b2
A         
a1   2   1
a2   0   2
'''
pd.crosstab(index=df['A'], columns=df['B'])

res4 = pd.crosstab(index=df['A'], columns=df['B'], normalize=True)

我们也可以使用rownamescolnames分别为index和columns起名

import pandas as pd
import numpy as np

# 原数据
df = pd.DataFrame({
        'A':['a1','a1','a2','a2','a1'],
        'B':['b2','b1','b2','b2','b1'],
        'C':[1,2,3,4,5]})

# 未使用参数rownames和colnames起别名
pd.crosstab(index=df['A'], columns=df['B'], 
            values=df['C'], aggfunc=np.sum,
            margins=True, margins_name='Total')

# 使用参数rownames和colnames起别名
pd.crosstab(index=df['A'], columns=df['B'], 
            values=df['C'], aggfunc=np.sum,
            rownames=['Acol'],colnames=['Bcol'],
            margins=True, margins_name='Total')

输出以下结果

# 未使用参数rownames和colnames起别名

    B     b1       b2    Total
                     
   a1     7.0      1.0       8
   a2     NaN    7.0       7
Total     7.0      8.0      15

# 使用参数rownames和colnames起别名 

 Bcol     b1       b2    Total
 Acol                  
   a1     7.0      1.0       8
   a2     NaN    7.0       7
Total     7.0      8.0      15

res4 

由上述结果可以清晰看到每个交叉位上的数据在全体中的地位

我们以(a1,b1)交叉位进行计算来源分析,在a1和b1交叉位上,值为2 / (2 + 1 + 0 + 2) = 2 / 5 = 0.4,故(a1,b1)交叉位值为0.4,其余交叉位计算类似

我们也可以对列进行归一化

'''
B   b1  b2
A         
a1   2   1
a2   0   2
'''
pd.crosstab(index=df['A'], columns=df['B'])

# 交叉表,按列归一化
res5 = pd.crosstab(index=df['A'], columns=df['B'], normalize='columns')

res5

我们以(a1,b2)交叉位进行计算来源分析,在a1和b2交叉位上,值为1 / (1 + 2) = 1 / 3 = 0.333333,故(a1,b2)交叉位值为0.333333,其余交叉位计算类似 

normalize参数可以帮助我们实现数据归一化,算法为对应值除以所有值的总和,让数据处于0~1的范围,方便我们观察此位置上的数据在全体中的地位 

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

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

相关文章

【51单片机】使用STC烧录软件生成定时器的代码以及注意事项

🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Love Story】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 1.点击定时器计算器​编辑 2.每次打开的时…

华为MPLS跨域C1方式RR场景(数据不经过RR)实验配置

目录 配置BGP邻居的建立 配置MPLS LDP 配置RR之间的MP-BGP邻居 配置通过ASBR学习PE路由并为PE分配标签(实现Vpnv4路由的传递和数据传输) 根据图配置接口的IP地址和IGP协议 BGP邻居用来传递标签和RR、PE的路由 MP-BGP邻居用来传递Vpnv4路由 配置BG…

QGC分析(一)-整体分析和通信流程

参考QGroundControl开发指南 设计理念 QGC用户界面是用QML实现的。 构建 可以按照这一篇来在Windows中下载源码并且编译。QGroungControl在QT中源码编译(包括配置环境) 通信流程 src/comm/LinkManager.cc LinkManager始终打开UDP端口,…

Vue3中如何实现数字翻牌效果?

一、需求 监听数据的变化,实现数字翻牌效果 本人OS:本想截一个gif,但是一直没找到合适的截gif工具......有好用的截gif工具,跪求戳戳我~ 二、思路 1.设置初始数组:[0] 2. 把获取到的新数据整个数字用逗号隔开,组成…

让Bito帮你写Mokito单元测试

前言 现在稍微大一点的公司应该都有单测覆盖率要求,比如核心工程单测覆盖率95%以上,非核心工程90%以上。单测可以降低开发错误的反馈回路,减少重复工作,提升开发效率。但是写单测对于开发来说需要额外的时间。我们可以用TestMe、…

AdaBoost算法介绍和代码实现

AdaBoost算法介绍和代码实现 算法原理 AdaBoost算法的核心思想是将弱分类器组合成一个强分类器。在每一轮迭代中,AdaBoost会训练一个新的弱分类器并调整每个样本的权重,使得之前分类错误的样本在下一轮迭代中受到更多的关注。最终,AdaBoost…

认识监听器(Listener)

监听器是什么? 监听器(Listener)是一种运行在后台的程序,它主要用于监控某些事件在系统中的发生,并且根据这些事件做一些特定的处理。在Web应用程序中,监听器可以观察ServletContext、HttpSession以及Serv…

PostgreSQL-数值类型

数值类型是最常用的几种数据类型之一,主要分为: 整型浮点型精确小数 数值类型介绍 数值类型列表 类型名称存储空间描述范围smallint2字节小范围的整数。Oracle中没有此数值类型,使用number代替-2^15 ~ 2^15-1int 或 integer4字节常用的整数…

日常开发为什么需要做Code Review

日常开发为什么需要做Code Review 一、背景 最近在开始一个新的项目,在查看项目中代码及具体细节时,发现这个项目真实一堆乱麻,没有规律可循,可总结下这个项目的缺陷 没有规律可循,没有结构性设计不做公共封装&#…

08_Uboot顶层Makefile分析_make过程

目录 make 过程 make 过程 配置好 uboot 以后就可以直接make 编译了,因为没有指明目标,所以会使用默认目标,主 Makefile 中的默认目标如下: 目标_all 又依赖于all,如下所示: 如果KBUILD_EXTMOD为空的话_all 依 赖 于all 。这 里 不 编 译 模 块,所 以KBUILD_EXTMOD肯定为空,_…

二分分类.

2.1 二分分类 在神经网络的计算中,通常先有一个叫做前向暂停(forward pause)或叫做前向传 播(foward propagation)的步骤,接着有一个叫做反向暂停(backward pause) 或叫做反向传播 (backward propagation)的步骤。 一张图片在计算机中是如何表示的&…

4。计算机组成原理(1)数据表示和运算

嵌入式软件开发,非科班专业必须掌握的基本计算机知识 核心知识点:数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统 一 进位计数法和不同进制数的相互转换 其他进制(b),转十进制的计算公式 十进制数,转…

Linux系统编程——多线程[上]:线程概念和线程控制

目录 1.再谈页表 2.Linux线程概念 2.1pthread原生库的基本使用 2.2PID和LWP 2.3Linux线程的资源以及优缺点 2.4Linux线程健壮性问题 2.5可重入函数和线程独立栈 3.Linux线程控制 3.1Linux线程终止 3.2Linux线程等待 3.3线程取消 3.4线程分离 使用线程库的注意事项…

【Python入门】Python基础语法

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…

净利润同比增长48.9%,中国平安“一览众山小”

中国平安价值迸发的速度,或许超过了所有人的想象。 4月26日晚,中国平安发布2023年一季度业绩报告,许多自媒体用“炸裂”来形容其亮眼的财务数据。财报显示,第一季度,集团实现营收2537.78亿元,同比增长30.8…

农机电招平台~java

摘要 随着农机电招行业的不断发展,农机电招在现实生活中的使用和普及,农机电招行业成为近年内出现的一个新行业,并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操作变简单,变…

LeetCode:383. 赎金信

🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题解目录 一、🌱[383. 赎金信](https://leetcode.cn/problems/ransom-note/)…

DOM概述

DOM概述 什么是DOM对象树化的DOM模型DOM 节点 如何获取DOM元素如何更改我们的DOM模型常用属性修改控制样式属性 事件事件监听 事件类型鼠标事件键盘事件焦点事件文本框输入事件 事件对象回调函数DOM 节点插入节点插入节点删除节点查找节点父子关系兄弟关系 什么是DOM 当网页被…

SPSS如何进行因子分析和主成分分析之案例实训?

文章目录 0.引言1.因子分析2.主成分分析 0.引言 因科研等多场景需要进行绘图处理,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对因子分析和主成分分析进行阐述。 1.因子分…

Android:LeakCanary原理的简单理解和使用

LeakCanary原理的简单理解和使用 1、背景2、LeakCanary2.1、LeakCanary 工作原理2.1.1、检测未被 GC 回收的对象2.1.2、转储堆2.1.3、分析堆2.1.4、对泄漏进行分类 2.2、LeakCanary 使用2.2.1、引入依赖2.2.1.1、原理 2.2.2、配置 LeakCanary2.2.3、检测内存泄漏 3、Fragment 和…