DataFrame—数据汇总4

文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

一.分组计算 

#示例数据
df = pd.read_csv("pokemon_data.csv",encoding="gbk")
df.head(10)
姓名类型1类型2总计生命值攻击力防御力速度时代
0BulbasaurGrassPoison318454949451
1IvysaurGrassPoison405606263601
2VenusaurGrassPoison525808283801
3VenusaurMega VenusaurGrassPoison62580100123801
4CharmanderFireNaN309395243651
5CharmeleonFireNaN405586458801
6CharizardFireFlying5347884781001
7CharizardMega Charizard XFireDragon634781301111001
8CharizardMega Charizard YFireFlying63478104781001
9SquirtleWaterNaN314444865431

 1.如何分组计算

假设现在要根据“类型1”这列来做分组计算

#查看下类型1中的类别数量分布
df["类型1"].value_counts()
Water       112
Normal       98
Grass        70
Bug          69
Psychic      57
Fire         52
Electric     44
Rock         44
Ground       32
Dragon       32
Ghost        32
Dark         31
Poison       28
Steel        27
Fighting     27
Ice          24
Fairy        17
Flying        4
Name: 类型1, dtype: int64
#查看类型1中有多少个类型
len(df["类型1"].value_counts())

Q1:想知道类型1的这18个种类各自的平均攻击力是多少(单列分组计算)

#根据类型1这列来分组,并将结果存储在grouped1中
grouped1 = df.groupby("类型1")
#输出grouped1,这里就是显示它是一个分组对象,并且存储的内存地址是0x0000000008EE9E80,没什么卵用
grouped1
#求类型1的18个种类各自的平均攻击力
grouped1[["攻击力"]].mean()
攻击力
类型1
Bug70.971014
Dark88.387097
Dragon112.125000
Electric69.090909
Fairy61.529412
Fighting96.777778
Fire84.769231
Flying78.750000
Ghost73.781250
Grass73.214286
Ground95.750000
Ice72.750000
Normal73.469388
Poison74.678571
Psychic71.456140
Rock92.863636
Steel92.703704
Water74.151786

小结一下:

grouped1 = df.groupby("类型1")这一步就是分组计算流程里的第一步:split

grouped1[["攻击力"]].mean() 这一步就是分组计算流程的第二和第三步:apply—combine

Q2:想知道类型1和类型2的组合类型里,每个组合各自的攻击力均值(多列分组计算)

grouped2 = df.groupby(["类型1","类型2"])
grouped2[["攻击力"]].mean()
想知道类型1和类型2的组合类型里,每个组合各自的攻击力均值、中位数、总和(对组应用多个函数)
grouped2[["攻击力"]].agg([np.mean,np.median,np.sum])

Q4:想知道类型1和类型2的组合类型里,每个组合各自的攻击力的均值和中位数,生命值的总和(对不同列应用不同的函数)

grouped2.agg({"攻击力":[np.mean,np.median],"生命值":np.sum})

Q5:对组内数据进行标准化处理(转换)

zscore = lambda x : (x-x.mean())/x.std()
grouped1.transform(zscore)

Q6:对组进行条件过滤

需求:针对grouped2的这个分组,希望得到平均攻击力为100以上的组,其余的组过滤掉

attack_filter = lambda x : x["攻击力"].mean() > 100
grouped2.filter(attack_filter)

Q7:将类型1和2作为索引列,按照索引来实现分组计算(根据索引来分组计算) 

#将类型1、类型2设置为索引列
df_pokemon = df.set_index(["类型1","类型2"])
#根据索引分组
grouped3 = df_pokemon.groupby(level=["类型1","类型2"])
grouped3
#分组计算各列均值
grouped3.mean()

2.组的一些特征

查看每个索引组的个数

grouped2.size()

得到每个索引组的在源数据中的索引位置

grouped2.groups

得到包含索引组的所有数据

#得到索引组为Fire和Flying的所有数据
grouped2.get_group(('Fire', 'Flying'))
for name,group in grouped2:print(name)print(group.shape)

二.数据透视表

1.数据透视表pivot_table

#示例数据
df_p = df.iloc[:10,0:6]
df_p
姓名类型1类型2总计生命值攻击力
0BulbasaurGrassPoison3184549
1IvysaurGrassPoison4056062
2VenusaurGrassPoison5258082
3VenusaurMega VenusaurGrassPoison62580100
4CharmanderFireNaN3093952
5CharmeleonFireNaN4055864
6CharizardFireFlying5347884
7CharizardMega Charizard XFireDragon63478130
8CharizardMega Charizard YFireFlying63478104
9SquirtleWaterNaN3144448
#做一些修改
df_p.loc[0:2,"姓名"] = "A"
df_p.loc[3:5,"姓名"] = "B"
df_p.loc[6:9,"姓名"] = "C"
df_p["类型2"] = df_p["类型2"].fillna("Flying")
df_p.rename(columns={"姓名":"组"},inplace=True)
#将组放在行上,类型1放在列上,计算字段为攻击力,如果没有指定,默认计算其均值
df_p.pivot_table(index="组",columns="类型1",values="攻击力")
类型1FireGrassWater
ANaN64.333333NaN
B58.0100.000000NaN
C106.0NaN48.0
#将组放在行上,类型1放在列上,计算攻击力的均值和计数
df_p.pivot_table(index="组",columns="类型1",values="攻击力",aggfunc=[np.mean,len])
meanlen
类型2DragonFlyingPoisonDragonFlyingPoison
类型1
AGrassNaNNaN64.333333NaNNaN3.0
BFireNaN58.0NaNNaN2.0NaN
GrassNaNNaN100.000000NaNNaN1.0
CFire130.094.0NaN1.02.0NaN
WaterNaN48.0NaNNaN1.0NaN
#将组和类型1放在行上,类型2放在列上,计算生命值和攻击力的均值和计数
df_p.pivot_table(index=["组","类型1"],columns="类型2",values=["生命值","攻击力"],aggfunc=[np.mean,len])
meanlen
攻击力生命值攻击力生命值
类型2DragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoison
类型1
AGrassNaNNaN64.333333NaNNaN61.666667NaNNaN3.0NaNNaN3.0
BFireNaN58.0NaNNaN48.5NaNNaN2.0NaNNaN2.0NaN
GrassNaNNaN100.000000NaNNaN80.000000NaNNaN1.0NaNNaN1.0
CFire130.094.0NaN78.078.0NaN1.02.0NaN1.02.0NaN
WaterNaN48.0NaNNaN44.0NaNNaN1.0NaNNaN1.0NaN
#将组和类型1放在行上,类型2放在列上,计算生命值和攻击力的均值和计数,并且将缺失值填充为0
df_p1 = df_p.pivot_table(index=["组","类型1"],columns="类型2",values=["生命值","攻击力"],aggfunc=[np.mean,len],fill_value=0)
df_p1
meanlen
攻击力生命值攻击力生命值
类型2DragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoison
类型1
AGrass0064.33333300.061.666667003003
BFire0580.000000048.50.000000020020
Grass00100.00000000.080.000000001001
CFire130940.0000007878.00.000000120120
Water0480.000000044.00.000000010010
#将组和类型1放在行上,类型2放在列上,计算生命值和攻击力的均值和计数,将缺失值填充为0,并且增加总计行列
df_p.pivot_table(index=["组","类型1"],columns="类型2",values=["生命值","攻击力"],aggfunc=[np.mean,len],fill_value=0,margins=True)

2.重塑层次化索引

stack():将数据最内层的列旋转到行上

unstack():将数据最内层的行旋转到列上

#示例数据
df_p1
meanlen
攻击力生命值攻击力生命值
类型2DragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoison
类型1
AGrass0064.33333300.061.666667003003
BFire0580.000000048.50.000000020020
Grass00100.00000000.080.000000001001
CFire130940.0000007878.00.000000120120
Water0480.000000044.00.000000010010
#将数据最内层的列旋转到行上,也即是将类型2转移到行上
df_p1.stack()
meanlen
攻击力生命值攻击力生命值
类型1类型2
AGrassDragon0.0000000.00000000
Flying0.0000000.00000000
Poison64.33333361.66666733
BFireDragon0.0000000.00000000
Flying58.00000048.50000022
Poison0.0000000.00000000
GrassDragon0.0000000.00000000
Flying0.0000000.00000000
Poison100.00000080.00000011
CFireDragon130.00000078.00000011
Flying94.00000078.00000022
Poison0.0000000.00000000
WaterDragon0.0000000.00000000
Flying48.00000044.00000011
Poison0.0000000.00000000
#将数据最内层的行旋转到列上,也即是将类型1转移到列上
df_p1.unstack()
mean...len
攻击力生命值...攻击力生命值
类型2DragonFlyingPoisonDragon...PoisonDragonFlyingPoison
类型1FireGrassWaterFireGrassWaterFireGrassWaterFire...WaterFireGrassWaterFireGrassWaterFireGrassWater
ANaN0.0NaNNaN0.0NaNNaN64.333333NaNNaN...NaNNaN0.0NaNNaN0.0NaNNaN3.0NaN
B0.00.0NaN58.00.0NaN0.0100.000000NaN0.0...NaN0.00.0NaN2.00.0NaN0.01.0NaN
C130.0NaN0.094.0NaN48.00.0NaN0.078.0...0.01.0NaN0.02.0NaN1.00.0NaN0.0

三.交叉表

用于计算分组频率用的特殊透视表

#示例数据
df_p
类型1类型2总计生命值攻击力
0AGrassPoison3184549
1AGrassPoison4056062
2AGrassPoison5258082
3BGrassPoison62580100
4BFireFlying3093952
5BFireFlying4055864
6CFireFlying5347884
7CFireDragon63478130
8CFireFlying63478104
9CWaterFlying3144448
#计算组和类型1的交叉频率
pd.crosstab(index=df_p["组"],columns=df_p["类型1"])
类型1FireGrassWater
A030
B210
C301

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

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

相关文章

Flask多线程开发指南

文章目录 1. 什么是多线程?2. Flask中的多线程3. 注意事项结论 在Web应用程序开发中,有时候需要处理一些耗时的任务,例如与数据库交互、发送网络请求或执行计算密集型的操作。为了保持用户体验的流畅性,我们可以使用多线程来处理这…

LoadBalancer

一、手写随机负载均衡 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><!--引入nacos discovery--> <dependency><groupId>com…

socket地址理解

socket介绍 套接字的基本概念 1. 套接字的定义&#xff1a; 套接字&#xff08;socket&#xff09;是计算机网络中用于通信的端点&#xff0c;它抽象了不同主机上应用进程之间双向通信的机制。 2. 套接字的作用&#xff1a; 套接字连接应用进程与网络协议栈&#xff0c;使…

vb.net打开CAD指指定路径文件

首先打开vsto,创建窗体&#xff0c;添加一个按钮&#xff0c;双击按钮录入代码&#xff1a; Public Class Form1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim cad As Objectcad CreateObject("autocad.Application")cad…

Java枚举的本质

目录 1.枚举简介 1.1.规范 1.2.枚举类真实的样子 1.3.枚举类的特点 1.4.枚举可以使用的方法 1.4.1.toString()方法 1.4.2.valueOf方法 1.4.3.values方法 1.4.4.ordinal方法 1.5.枚举的用法 1.5.1.常量 1.5.2.switch 1.5.3.枚举中增加方法 1.5.4.覆盖枚举方法 1.5…

工具推荐:市面上有哪些带有ai问答机器人的SaaS软件

众所周知&#xff0c;SaaS&#xff08;软件即服务&#xff09;模式下的AI问答机器人已经逐渐成为企业、个人在办公、生活和学习中的辅助工具。ai问答机器人凭借高效、便捷、智能的特点&#xff0c;为用户提供了全新的交互体验。本文将推荐几款市面上好用的带有ai问答机器人的Sa…

【文心智能体】创建一个属于自己的生活情感类智能体

文章目录 前言一、创建智能体二、体验 前言 智能体技术的快速发展&#xff0c;进一步激发了各行业开发者对其实际应用及用户需求的深入探索。 创建一个属于自己的智能体。文心一言提供了一个很好的平台。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考…

GpuMall智算云:Ubuntu 实例桌面版

基于 ubuntu18.04 安装的桌面版本&#xff0c;桌面使用 xfce4 &#xff0c;集成了 Pytorch2.3.0、cuda11.8、Python3.10、VNC、noVNC、VSCode-Server。 在 镜像市场 选择xfce4-desktop镜像&#xff0c;然后进行创建实例 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall…

一维前缀和[模版]

题目链接 题目: 分析: 因为要求数组中连续区间的和, 可以使用前缀和算法注意:下标是从1开始算起的, 真正下标0的位置是0第一步: 预处理出来一个前缀和数组dp dp[i] 表示: 表示[1,i] 区间所有元素的和dp[i] dp[i-1] arr[i]例如示例一中: dp数组为{1,3,7}第二步: 使用前缀数…

《统计满足条件的4位数个数》

描述 给定若干个四位数&#xff0c;求出其中满足以下条件的数的个数&#xff1a; 个位数上的数字减去千位数上的数字&#xff0c;再减去百位数上的数字&#xff0c;再减去十位数上的数字的结果大于零。 输入描述 输入为两行&#xff0c;第一行为四位数的个数n&#xff0c;第二…

RabbitMQ - SimpleMessageListenerContainer的实现逻辑

RabbitMQ - SimpleMessageListenerContainer的实现逻辑 Queue&#xff08;队列&#xff09;&#xff1a;在 RabbitMQ 中用于存储消息的数据结构。生产者将消息发送到队列中&#xff0c;而消费者从队列中接收消息。 Connection&#xff08;连接&#xff09;&#xff1a;连接是应…

Python代码实现代价函数

最小二乘法 最小二乘法是一种在统计学、数学、工程学和计算机科学等领域广泛使用的优化方法。 基本原理 最小二乘法的主要目的是找到一组模型参数&#xff0c;使得根据这些参数所预测的数据与实际观测数据之间的差异&#xff08;即残差&#xff09;的平方和最小。 数学表达…

5.22R语言初步学习-1

今天上课讲R语言&#xff0c;要干什么没讲&#xff0c;分析什么&#xff0c;目的是什么没讲。助教基本上就是让我们打开窗口&#xff0c;按要求抄代码指令&#xff0c;代码原理也没讲......再加上最近正好在学概率论与数理统计&#xff0c;肯定是有用的&#xff0c;所以还是学习…

PHP质量工具系列之php_CodeSniffer

PHP_CodeSniffer 是一组两个 PHP 脚本&#xff1a;主脚本 phpcs 对 PHP、JavaScript 和 CSS 文件进行标记&#xff0c;以检测是否违反定义的编码标准&#xff1b;第二个脚本 phpcbf 自动纠正违反编码标准的行为。PHP_CodeSniffer 是一个重要的开发工具&#xff0c;可以确保你的…

【简单介绍下近邻算法】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Python-3.12.0文档解读-内置函数hash()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 功能描述 参数 返回值 特性 使用示例 注意事项 记忆策略 常用场景 …

Predictable MDP Abstraction for Unsupervised Model-Based RL

ICML 2023 paper code Intro 文章提出了一种用于无监督基于模型强化学的方法&#xff0c;称为可预测MDP抽象&#xff08;Predictable MDP Abstraction, PMA&#xff09;。在MBRL中&#xff0c;一个关键部分是能够准确建模环境动力学动态模型。然而&#xff0c;这个预测模型误…

debian/control文件中常见字段的介绍

1 简介 在Debian或基于Debian的发行版中&#xff0c;debian/control文件是软件包管理的关键部分。它包含了软件包的各种元数据和安装脚本信息&#xff0c;用于软件包管理系统&#xff08;如dpkg&#xff09;识别如何处理该软件包。以下是debian/control文件中常见字段的详细介…

【SQL国际标准】ISO/IEC 9075:2023 系列SQL的国际标准详情

目录 &#x1f30a;1. 前言 &#x1f30a;2. ISO/IEC 9075:2023 系列SQL的国际标准详情 &#x1f30a;1. 前言 ISO&#xff08;国际标准化组织&#xff0c;International Organization for Standardization&#xff09;是一个独立的、非政府间的国际组织&#xff0c;其宗旨是…

IPKISS ------ AMF 添加自定义层

IPKISS ------ AMF 添加自定义层 正文 正文 很多时候&#xff0c;我们想要添加属于我们自己的层&#xff0c;此时我们需要向 AMF pdk 中的 gdsii.py 和 layers.py 文件添加层的信息。这两个文件的目录如下&#xff1a; 在 gdsii.py 文件下的 TECH.GDSII.LAYERTABLE 字典中我们…