热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Pandas Query方法使用深度总结【python入门】

大多数Pandas用户都熟悉iloc[]和loc[]索引器方法,用于检索行和列。但是随着检索数据的规则变得越来越复杂,这些方法也随之变得更加复杂而臃肿。本文将展示如何使用 quer

大多数 Pandas 用户都熟悉 iloc[] 和 loc[] 索引器方法,用于从 Pandas DataFrame 中检索行和列。但是随着检索数据的规则变得越来越复杂,这些方法也随之变得更加复杂而臃肿。

同时 SQL 也是我们经常接触且较为熟悉的语言,那么为什么不使用类似于 SQL 的东西来查询我们的数据呢

事实证明实际上可以使用 query() 方法做到这一点。因此,在今天的文章中,我们将展示如何使用 query() 方法对数据框执行查询

获取数据

我们使用 kaggle 上的 Titanic 数据集作为本文章的测试数据集,下载地址如下:https://www.kaggle.com/datasets/tedllh/titanic-train

当然也可以在文末获取到萝卜哥下载好的数据集

载入数据

下面文末就可以使用 read_csv 来载入数据了

import pandas as pd
df = pd.read_csv("titanic_train.csv")
df

数据集有 891 行和 12 列:

使用 query() 方法

让我们找出从南安普敦 (‘S’) 出发的所有乘客,可以使用方括号索引,代码如下所示:

df[df["Embarked"] == "S"]

如果使用 query() 方法,那么看起来更整洁:

df.query("Embarked == "S"")

与 SQL 比较,则 query() 方法中的表达式类似于 SQL 中的 WHERE 语句。

结果是一个 DataFrame,其中包含所有从南安普敦出发的乘客:

query() 方法接受字符串作为查询条件串,因此,如果要查询字符串列,则需要确保字符串被正确括起来:

很多时候,我们可能希望将变量值传递到查询字符串中,可以使用 @ 字符执行此操作:

embarked = "S"
df.query("Embarked == @embarked")

或者也可以使用 f 字符串,如下所示:

df.query(f"Embarked == "{embarked}"")

就个人而言,我认为与 f-string 方式相比,使用 @ 字符更简单、更优雅,你认为呢

如果列名中有空格,可以使用反引号 (``) 将列名括起来:

df.query("`Embarked On` == @embarked")

以 In-place 的方式执行 query 方法

当使用 query() 方法执行查询时,该方法将结果作为 DataFrame 返回,原始 DataFrame 保持不变。如果要更新原始 DataFrame,需要使用 inplace 参数,如下所示:

df.query("Embarked == "S"", inplace=True)

当 inplace 设置为 True 时,query() 方法将不会返回任何值,原始 DataFrame 被修改。

指定多个条件查询

我们可以在查询中指定多个条件,例如假设我想获取所有从南安普敦 (‘S’) 或瑟堡 (‘C’) 出发的乘客。如果使用方括号索引,这种语法很快变得非常笨拙:

df[(df["Embarked"] == "S") | (df["Embarked"] == "C")]

我们注意到,在这里我们需要在查询的条件下引用 DataFrame 两次,而使用 query() 方法,就简洁多了:

df.query("Embarked in ("S","C")")

查询结果如下

如果要查找所有不是从南安普敦(‘S’)或瑟堡(‘C’)出发的乘客,可以在 Pandas 中使用否定运算符 (~):

df[~((df["Embarked"] == "S") | (df["Embarked"] == "C"))]

使用 query() 方法,只需要使用 not 运算符:

df.query("Embarked not in ("S","C")")

以下输出显示了从皇后镇 (‘Q’) 出发的乘客以及缺失值的乘客:

说到缺失值,该怎么查询缺失值呢,当应用于列名时,我们可以使用 isnull() 方法查找缺失值:

df.query("Embarked.isnull()")

现在将显示 Embarked 列中缺少值的行:

其实可以直接在列名上调用各种 Series 方法:

df.query("Name.str.len() < 20")  # find passengers whose name is 
                                 # less than 20 characters
df.query(f"Ticket.str.startswith("A")") # find all passengers whose 
                                        # ticket starts with A

比较数值列

我们还可以轻松比较数字列:

df.query("Fare > 50")

以下输出显示了票价大于 50 的所有行:

比较多个列

还可以使用 and、or 和 not 运算符比较多个列,以下语句检索 Fare 大于 50 和 Age 大于 30 的所有行:

df.query("Fare > 50 and Age > 30")

下面是查询结果

查询索引

通常当我们想根据索引值检索行时,可以使用 loc[] 索引器,如下所示:

df.loc[[1],:]  # get the row whose index is 1; return as a dataframe

但是使用 query() 方法,使得事情变得更加直观:

df.query("index==1")

结果如下

如果要检索索引值小于 5 的所有行:

df.query("index<5")

结果如下

我们还可以指定索引值的范围:

df.query("6 <= index < 20")

结果如下

比较多列

我们还可以比较列之间的值,例如以下语句检索 Parch 值大于 SibSp 值的所有行:

df.query("Parch > SibSp")

结果如下

总结

从上面的示例可以看出,query() 方法使搜索行的语法更加自然简洁,希望感兴趣的小伙伴多加练习,真正的达到融会贯通的地步哦~

到此这篇关于Pandas Query方法使用深度总结的文章就介绍到这了,更多相关Pandas Query方法内容请搜索编程笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程笔记!


推荐阅读
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
author-avatar
小小的忧伤团_170
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有