大多数 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 方法深度总结相关推荐

  1. python query方法_Pandas dataframe.query方法语法

    问题: 我想更好地理解PandasDataFrame.query方法以及下面的表达式表示什么:match = dfDays.query('index > @x.name & price ...

  2. pandas数据分析方法

    利用pthon进行数据分析-pandas 环境配置 安装pandas.numpy.xlrd 数据的读取 创建文件 读写csv或txt数据 读写mysql数据 读取与修改excel数据 -*- codi ...

  3. Pandas使用方法

    Pandas使用方法 1 Pandas介绍 2008年WesMcKinney开发出的库 专门用于数据挖掘的开源python库 以Numpy为基础,借力Numpy模块在计算方面性能高的优势 基于matp ...

  4. contentProvider中有关query方法的使用

    query()方法介绍  * 方法的声明如下:  * public final Cursor query(Uri uri, String[] projection, String selection, ...

  5. php中query()作用,query()方法

    query()方法 履行SQL命令,不管如何通过PHP脚本与Mysql数据库交互,进程都是1样的,创建1个SQL语句,再传递给履行查询的函数. 在mysqli类中提供了几种履行SQL命令的方法,其中最 ...

  6. python安装pandas模块-python安装numpy和pandas的方法步骤

    最近要对一系列数据做同比比较,需要用到numpy和pandas来计算,不过使用python安装numpy和pandas因为linux环境没有外网遇到了很多问题就记下来了.首要条件,python版本必须 ...

  7. SimpleExecutor.doQuery()-执行的StatementHandler 的query()方法

    RoutingStatementHandler 的query()方法. delegate 委派,最终执行PreparedStatementHandler 的query()方法.

  8. python最快的循环方法_【转】【Python效率】五种Pandas循环方法效率对比

    [Python效率]五种Pandas循环方法效率对比 - 文兄的文章 - 知乎 https://zhuanlan.zhihu.com/p/80880493 正文: 如果你使用过Python及Panda ...

  9. getContentResolver().query()方法selection参数使用详解(转)

    如何在managedQuery()和getContentResolver().query()方法中实现结果去重 有时候,我们需要对查询的数据库结果进行去重.在SQL中我们可以通过distinct关键字 ...

  10. python如何安装panda数据库_在Pycharm中安装Pandas库方法(简单易懂)

    开发环境的搭建是一件入门比较头疼的事情,在上期的文稿基础上,增加一项Anaconda的安装介绍.Anaconda是Python的一个发行版本,安装好了Anaconda就相当于安装好了Python,并且 ...

最新文章

  1. mysql sp cursoropen_三个重要的游标sp_cursoropen_MySQL
  2. Unity初步 基本拼图实现
  3. nyoj99(欧拉路)
  4. 测试HAPROXY的文件分流办法
  5. VB6中如何使用C#开发的WebService进行开发
  6. id门禁卡复制到手机_手机NFC有哪些功能?怎么设置手机门禁卡?别浪费了手机的NFC功能...
  7. ADO RecondsetPtr 以及如何实现对表的增加删除数据
  8. Oracle Goldengate在HP平台裸设备文件系统OGG-01028处理
  9. 网上银行等电子支付平台的WEB登陆安全性简要分析
  10. java大文件排序_java对大文件进行归并排序(利用胜者树)
  11. HM个性化Recommendations--kaggle推荐比赛
  12. php++redius,【答疑】请问edius音波显示快捷键是什么呢?怎么使用的呢? - 羽兔网问答...
  13. 联想电脑自动锁屏解决方法
  14. 工业级嵌入式WiFi模块 无线网关智能家居 WiFi音视频传输模块 WiFi转有线网口模块方案
  15. SDL 加载显示JPEG图片
  16. Windows 7提示数据错误 循环冗余检查怎么办?
  17. access行列转换。
  18. 实验五—JEPG 原理分析及 JPEG 解码器的调试
  19. 树莓派官方系统安装教程
  20. Android根据语言适配货币符,ios – 使用NSLocale根据国家/地区代码或国家/地区名称获取货币符号...

热门文章

  1. 【离散数学】集合的基数
  2. PHP excel 直接输出导出
  3. 【修真院“纯洁”系列之十九】驱逐令
  4. 什么是最小可行产品 MVP?
  5. 写给程序员的 2018 新年计划清单
  6. 教你一招恢复100分信用分,新手违规被扣40分,还有救吗?
  7. 人人商城系统安装服务器上,微擎及人人商城安装
  8. JAVA根据年月查询当月的天数
  9. 决策规划算法二:生成参考线(FEM_POS_DEVIATION_SMOOTHING)
  10. 信息安全等级保护概述