Pandas Query 方法深度总结,你学会了吗?

大多数 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 is1; 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() 方法使搜索行的语法更加自然简洁,希望感兴趣的小伙伴多加练习,真正的达到融会贯通的地步哦!

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/236900.html<

(0)
运维的头像运维
上一篇2025-04-22 05:42
下一篇 2025-04-22 05:44

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注