DataFrame—数据汇总8

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

#示例数据
df = pd.read_csv("pokemon_data.csv",encoding="gbk")
df.head(10)

一.数据选取

Q1:选取第1行的数据(选取单行数据)

(1)按索引标签选取(loc做法)

df.loc[0]   #返回的是Series
df.loc[[0]]  #如果在里面多加一个方括号,那么返回的是DataFrame

(2)按索引位置选取(iloc做法)

df.iloc[0]      #返回的是Series
df.iloc[[0]]  #如果在里面多加一个方括号,那么返回的是DataFrame

相信你一定会很好奇:为什么在这里loc和iloc得到的结果是一样的?

下面会来解释

Q2:选取第2到第5行的数据(选取连续行的数据)

(1)按索引标签选取(loc做法)

df.loc[1:4]

你可能产生了一个疑问:不是说切片的末端是取不到的吗,也就是4这个索引所指向的第5行应该是取不到的

这是因为loc是按照索引标签来选取数据的,而不是根据位置来选取,举个例子:

#以姓名这一列作为索引列
df_name = df.set_index("姓名")
df_name

如果我要返回第2行到第5行的数据,该怎么做呢?

#如果按照刚刚的写法,就会出错
df_name.loc[1:4]
#因为loc是按照索引标签选取的,按照下面这种写法就对了
df_name.loc["Ivysaur":"Charmander"]

 (2)按索引位置选取(iloc做法)

df.iloc[1:5]

我们需要返回的是第2行到第5行,因此对应的索引位置是1:4,但是由于iloc是按照位置来选取数据的,因此末端索引是取不到的,那么末端就需要再加1,这样就能确保第5行能取到了,而取不到第6行

为了能更直观地体现出loc和iloc的区别,接下来以df_name为示例数据

#示例数据
df_name.head(10)

Q3:选取第2行,第4行,第7行,第10行的数据(选取特定行的数据)

(1)按索引标签选取(loc做法)

df_name.loc[["Ivysaur","VenusaurMega Venusaur","Charizard","Squirtle"]]

(2)按索引位置选取(iloc做法)

df_name.iloc[[1,3,6,9]]

Q4:选取攻击力列(选取单列的数据)

(1)直接方括号+列名

#直接方括号输入列名即可,推荐这种方法
df_name["攻击力"]
#返回的是一个Series
df_name[["攻击力"]]
#返回的是一个DataFrame

(2)按索引标签选取(loc做法)

#虽然用loc也能提取单列,但是显得不够简洁
df_name.loc[:,["攻击力"]]

(3)按索引位置选取(iloc做法)

df_name.iloc[:,[4]]

4)点号选取法

#也可以通过点号选取列
df_name.攻击力

点号提取列的这种方法的优点是:写法比较简洁快速,缺点是如果列名和关键字重复了就无法提取了,因为点号调用的是对象,python无法判断出名字一样的列名和关键字

#新增一列class,值为1
df_name["class"] = 1
df_name

由于class是python的关键字,而点号选取列实质上是在调用对象,本身列名class和关键字class重叠了,导致无法调用成功 

df_name.class

Q5:选取类型1列到攻击力列的所有数据(选取连续列的数据)

(1)按索引标签选取(loc做法)

df_name.loc[:,"类型1":"攻击力"]

 (2)按索引位置选取(iloc做法)

df_name.iloc[:,:5]

Q6:选取“类型2”列,攻击力列,防御力列的所有数据(选取特定列的数据)(

(1)方括号+列名

#用方括号+列名来直接提取,这种方式比较简洁
df_name[["类型2","攻击力","防御力"]]

(2)按索引标签选取(loc做法)

df_name.loc[:,["类型2","攻击力","防御力"]]

(3)按索引位置选取(iloc做法)

df_name.iloc[:,[1,4,5]]

Q7:选取第3行到第8行,类型1列到攻击力列(选取部分行部分列的数据)

(1)按索引标签选取(loc做法)

df_name.head(10)
df_name.loc["Venusaur":"CharizardMega Charizard X","类型1":"攻击力"]

(2)按索引位置选取(iloc做法)

df_name.iloc[2:8,:5]

ix选取数据的做法

#示例数据,在这里索引为整数标签
df_1 = df.head(10)
df_1
#选出第2到第4行的数据
df_1.ix[1:3]
#选出类型1列到攻击力列的数据
df_1.ix[:,"类型1":"攻击力"]
#列也能通过位置选出
df_1.ix[:,1:6]
#选出第2行到第5行,第2列到第4列的数据
df.ix[1:4,"类型1":"总计"]
#或者列是通过位置选出
df.ix[1:4,1:4]
#示例数据,在这里索引为非整数标签
df_2 = df_1.set_index("姓名")
df_2
#选取第2行到第4行的数据
df_2.ix[1:4]
#选取第2列到第5列的数据
df_2.ix[:,1:5]
#选取第2行到第6行,第2列到第5列的数据
df_2.ix[1:6,1:5]
#也可以用索引标签选取
df_2.ix["Ivysaur":"Charmeleon","类型2":"攻击力"]

ix的工作原理:根据索引的类型分2种情况:

1.索引为整数标签,那么按照索引标签选取行数据,不能按照索引位置选取行数据,列数据既能通过标签选取也能通过位置选取。

2.当索引为非整数标签(如字符串标签),那么可以用索引标签选取行数据,也可以按照索引位置选取行数据,列数据既能通过标签选取也能通过位置选取。

用两个例子说明ix的工作原理,并且说明下ix和loc和iloc的区别

例子1,索引为整数标签

df_number = pd.DataFrame({"id":list("abcdefghij"),"score":range(10,20)},index=[27,26,25,24,23,1,2,3,4,5])
df_number

第一种情况,用在索引内的整数标签来测试(例如[:2])

df_number.loc[:2]
#loc按照索引标签选取数据,因此返回了第1行到第7行的数据
df_number.iloc[:2]
#iloc按照索引位置选取数据,因此返回了前2行的数据
df_number.ix[:2]
#返回了第1行到第7行的数据,说明ix是优先按照索引标签选取数据
第二种情况,用不在索引内的整数标签来测试(例如6)
df_number.loc[:6]
df_number.iloc[:6]
#因为是按照位置选取,所以返回了前6行数据
df_number.ix[:6]

第2个例子,索引为非整数标签类型,以字符串标签为例

df_str = df_number.set_index("id")
df_str
df_str.ix[:2]

说明了当标签为字符串标签时,即使:2不在索引标签内,ix也能按照位置选取数据

个人建议:还是使用loc和iloc来选取数据较好,因为分工明确,loc通过索引标签选取数据,iloc通过索引位置选取数据,所以你会很清除地知道你是在索引标签上操作还是在索引位置上操作,不会觉得混乱。我并不是特别建议使用ix,ix会让你觉得很混乱,也会让别人看你的代码时会在想:到底现在是在索引标签上操作还是位置上操作?这就增加了一个判断的过程。

二.数据筛选

#示例数据
df.head()

Q1:选取出攻击力大于100的所有数据

1.loc筛选
df.loc[df["攻击力"] > 100]

2.query筛选

df.query("攻击力 > 100")

Q2:选出攻击力大于100且防御力大于100的数据,并且列只要姓名、攻击力、防御力

1.loc筛选

#做法1
df.loc[df["类型1"] == "Grass"]
df.loc[(df["攻击力"] > 100) & (df["防御力"] > 100),["姓名","攻击力","防御力"]]

2.query筛选

df.query("攻击力 > 100 & 防御力 > 100")[["姓名","攻击力","防御力"]]

但是query的参数中不能引用变量,而loc可以

Q3:选出类型1为Grass的所有数据

1.loc筛选

#做法2
df.loc[df["类型1"].isin(["Grass"])]

2.query筛选

df.query("类型1 == 'Grass'")

三.多重索引

Q1:什么是多重索引

2层或2层以上的索引

为什么会用到多重索引呢?

因为有时候需要通过多个维度来查看数据

Q2:如何创建多重索引

#当我们要以字符串列作为索引列时,要保证这列为字符串格式
df[["类型1","类型2"]] = df[["类型1","类型2"]].astype("str")
#创建一个具有2重索引的数据作示例
df_pokemon = df.set_index(["类型1","类型2"])
df_pokemon

参数介绍

drop:是指该列被指定为索引后,是否删除该列,默认为True,即删除该列。如果改成False,则多重索引在数据集的列中也会保留

append:指定是否保留原索引,默认为False,即不保留,如果改成True,则保留原索引

inplace:指是否在源数据的基础上修改,默认为False,即不修改,返回一个新的数据框,如果改成True,则直接在源数据上修改

level介绍

#获取第一层索引
df_pokemon.index.get_level_values(0)
#获取第二层索引
df_pokemon.index.get_level_values(1)
#交换level
df_pokemon.swaplevel()

Q3:如何通过多重索引选取数据

df_pokemon.head(10)

先对数据源的索引进行升序排序

df_pokemon.sort_index(inplace=True)
df_pokemon

为什么要对索引升序排序?

因为如果没有对索引进行升序排序的话,在多重索引选取数据的过程中无法通过切片选取数据,切片是由小到大取的,例如字符串a→z,数字0→100,所以在对索引进行升序后,才能正确地切片选取数据

接下来根据需求通过多重索引选取数据

#取出第一索引列中值为Bug的所有数据
df_pokemon.loc["Bug"]
#取出第一索引列为Bug,第二索引列为Poison的所有数据
df_pokemon.loc[("Bug","Poison")]
#选出第一索引列为Bug到Grass的所有数据
df_pokemon.loc[slice("Bug","Grass")]
#选出第一索引列为Bug到Grass,且第二索引列为Electric的所有数据
df_pokemon.loc[(slice("Bug","Grass"),"Electric"),:]

 当想要取某一列索引下的全部数据时就需要用slice(None)

#取第二索引列为Electric的所有数据
df_pokemon.loc[(slice(None),"Electric"),:]
#取第二索引列为Electric和Fire,且列为姓名到攻击力的所有数据
df_pokemon.loc[(slice(None),["Electric","Fire"]),"姓名":"攻击力"]

前面的做法有点繁琐,还有更简洁的做法,可以不用去写slice

idx = pd.IndexSlice
#取第二索引列为Electric和Fire,且列为姓名到攻击力的所有数据
df_pokemon.loc[idx[:,["Electric","Fire"]],"姓名":"攻击力"]
#取第二索引为Electric到Fire的所有数据
df_pokemon.loc[idx[:,"Electric":"Fire"],:]
#取第一索引为Bug到Grass,且第二索引为Electric到Fire的所有数据
df_pokemon.loc[idx["Bug":"Grass","Electric":"Fire"],:]
#选取第一索引列即类型1为Bug的所有数据
df_pokemon.xs("Bug",level=0)
#选取第二索引列为Electric的所有数据
df_pokemon.xs("Electric",level=1)
#选取第二索引列为Electric的所有数据,并且保留第二索引列
df_pokemon.xs("Electric",level=1,drop_level=False)
#选取第一索引列为Bug,第二索引列为Electric的所有数据
df_pokemon.xs(("Bug","Electric"),level=(0,1))
#level也可以是索引列名
df_pokemon.xs(("Bug","Electric"),level=(["类型1","类型2"]))

xs在每个索引列上选择的标签只能是一个,所以做不到切片标签的选取

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

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

相关文章

《Ai企业知识库》-模型实践-rasa开源学习框架-搭建简易机器人-环境准备(针对windows)-02

rasa框架 Conversational AI Platform | Superior Customer Experiences Start Here 阿丹: 其实现在可以使用的ai的开发框架有很多很多,就需要根据各个模型的能力边界等来讨论和设计。 rasa整体流程以及每一步的作用 NLU(自然语言理解): 自然语言理解&#xff…

通过Ubuntu虚拟机+Linux移植LVGL并通过linux Frame buffer显示

文章参考:https://gitee.com/socbis/linux-lvgl lvgl on linux Frame buffer 主机环境: Ubuntu 18.04lvgl 8.0.1 获取源码并运行demo 获取源码 需要3样东西来构建demo : lvgl核心控件库: 从此处获取源码 lvgl,选择版本 Release v8.0.1. 显示和触摸接…

【项目问题解决】 java.lang.IllegalArgumentException: XML fragments parsed

java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for com.xxx.xxx.xxx.xxx.dao.SingleApasInfoDao.selectListCondition 目录 【项目问题解决】 java.lang.IllegalArgumentException: XML fragments parsed from pr…

嵌入式之译码器

系列文章目录 译码器嵌入式之译码器 嵌入式之译码器 系列文章目录一、译码器定义二、常见类型的译码器三、工作原理 一、译码器定义 译码器(Decoder)是一种数字电路,其主要功能是从输入的编码信号中解码出特定的信息或控制信号。 译码器通常…

树与二叉树的概念介绍

一.树的概念及结构: 1.树的概念: 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 有…

【记录】初次本地搭建的模型-MiniCPM 2B

前言 查阅众多开源大模型后,打算动手尝试搭建端侧模型,看看效果。选中MiniCPM主要是因为参数小,同时中文支持相对较好。 首先对按照官网提供的demo进行了尝试,然后在colab中完成了一个webui程序并测试,最后通过docker环…

【MATLAB】去除趋势项(解决频谱图大部分为零的问题)

1.概 述 在许多实际信号分析处理中信号经FFT变换后得到的频谱谱线值几乎都为0,介绍这是如何形成的,又该如何去解决。 2.案例分析 读入一组实验数据文件(文件名为qldata.mat),作出该组数据的频谱图。程序清单如下: clear; clc; close all;…

3.5 四个子空间的维度

一、概述 这一节的主要定理是将秩与维度联系在一起。矩阵的秩就是主元的个数,子空间的维度是基向量的个数,我们计算出这两个数就可以得到秩与维度。 A A A 的秩揭露了四个基本子空间的维度。 四个子空间中,两个子空间来自 A A A&#xff0c…

第十七讲:结构体

第十七讲:结构体 1.初始结构体1.1结构体声明1.2结构体变量的创建和初始化1.2.1结构体变量的创建1.2.2结构体变量的初始化1.2.2.1普通初始化1.2.2.2结构体数组1.2.2.3结构体指针 1.3typedef定义结构体1.4结构体的自引用1.5结构体的特殊声明 2.结构体内存对齐2.1对齐规…

基于STM32实现智能空气净化系统

目录 引言环境准备智能空气净化系统基础代码示例:实现智能空气净化系统 空气质量传感器数据读取风扇和滤网控制显示系统用户输入和设置应用场景:家庭空气净化与健康管理问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌入式系统中…

Day 40 Web容器-Tomcat

Tomcat 一:Tomcat简介 1.简介 ​ Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目 ​ Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器 ​ Tomcat是WEB容器/WE…

mac提示 “xxxx.app“已损坏,无法打开。你应该将它移到废纸篓

解决方式: sudo xattr -r -d com.apple.quarantine /Applications/GoLand.app sudo xattr -r -d com.apple.quarantine 后面是可执行的文件所在目录 在 macOS 系统中,sudo xattr -r -d com.apple.quarantine 这个命令用于删除文件或文件夹上的“隔离”属性。这里…

删除crossover容器里的指令图标

#如何删除crossover容器里的指令图标# 在使用crossover的时候发现容器里的图标一旦创建就没有删除的功能, 非常的不科学 解决办法 打开下面这个路径, 删除里面的对应的文件, 注意用户名要换成你自己的 /Users/用户名/Library/Application Support/CrossOver/Bott…

idea中git拉取失败

之前clone好好的,今天突然就拉取不下来了。很多时候是用户凭证的信息没更新的问题。由于window对同一个地址都存储了会话。如果是新的会话,必须要更新window下的凭证。 然后根据你的仓库找到你对应的账户,更新信息即可。

aws lakeformation跨账号共享数据的两种方式和相关配置

lakeformation授权方式分为 基于tag的授权基于命名资源的授权 先决条件 跨账号共享数据的先决条件(命名资源和tag授权都需要) 分两种情况 如果账户中没有glue data catalog资源策略,则LakeFormation跨账户授予将照常进行 如果存在glue d…

Docker学习(4):部署web项目

一、部署vue项目 在home目录下创建项目目录 将打包好的vue项目放入该目录下,dist是打包好的vue项目 在项目目录下,编辑default.conf 内容如下: server {listen 80;server_name localhost; # 修改为docker服务宿主机的iplocation / {r…

面试手撕——使用两个线程交替打印1-100

记录一下使用两个线程交替打印1-100的操作: /*** description: 使用两个线程交替打印1-100* author: Jay* create: 2024-05-27 21:29**/ public class print_1_to_100 {static volatile int flag 1; //此处需要加关键字volatile保证变量之间的可见性,否则程序将会…

Android:使用Kotlin搭建MVI架构模式

一、简介MVI架构模式 M:Model 数据层,包含应用数据和业务逻辑V:View 界面层,在屏幕上显示应用数据,包含与界面相关的状态和界面逻辑,根据界面状态对象更新UI,界面状态定义是不可变的。这样的主要…

Linux-通配符与正则表达式

补充:命令 输出重定向 标准输出:是将信息输出在终端 标准错误输出:在执行命令的过程中所产生错误信息也是输出在终端 标准输入:从键盘输入 1、标准输入重定向 作用:将本来要显示在终端上的信息重定向到一个文件夹中 …

【Spring Cloud】服务熔断

目录 服务雪崩效应服务雪崩效应形成的原因及应对策略小结 Hystrix介绍Hystrix可以做什么1.资源隔离2.请求熔断3.服务降级 小结 Hystrix实现服务降级方式一:HystrixCommand注解方式1.服务提供者1.1业务接口和业务实现中添加方法hystrixTimeout1.2控制器中处理/provid…