Pandas DataFrame.query()

2025年3月17日 | 阅读 10 分钟

Python 是一种出色的编程语言,用于执行数据分析,这主要归功于它提供的以数据为中心的出色包生态系统。Pandas 是这些包之一,它允许用户高效有效地导入和分析数据。数据分析需要许多过滤操作。Pandas DataFrame 提供了多种方法来过滤数据框中的数据,其中 query() 方法就是其中之一。

在下面的教程中,我们将通过示例学习 DataFrame.query() 方法。但在开始之前,让我们讨论一下 Python Pandas 包的基础知识。

Pandas 简介

Pandas 是一个开源但功能强大的 Python 包,用于数据分析和操作。Pandas 包提供两种主要数据结构 - DataFrame 和 Series。这些数据结构简化了文本数据和数字数据的表格数据管理过程。这些过程包括:

  1. 数据加载
  2. 数据制表
  3. 数据清理
  4. 数据过滤
  5. 处理缺失数据
  6. 数据归一化
  7. 数据检查
  8. 统计数据分析
  9. 数据保存等等。

理解 Pandas 的工作原理

Pandas 包围绕 DataFrame 和 Series 对象展开。DataFrame 对象是用于以行和列存储数据的二维表,而 Series 对象是用于仅存储单一类型数据的一维数组。

Pandas 与 NumPy 库协同工作,NumPy 库允许用户高效地对大型数组执行各种数值操作。与 NumPy 的这种集成允许两个包(一个表格,一个数值)之间进行统一和更快的操作。

我们可以从不同的数据源创建 DataFrame 和 Series 对象,例如 CSV 文件、Excel 文件、SQL 数据库,甚至 Python 字典和列表。

安装 Pandas 包后,我们可以访问多个函数来从各种源读取和写入数据,从而简化任何格式的数据制表过程。

Pandas 的主要特点

Pandas 是一个广泛用于数据操作、清理和分析的 Python 库。以下是 Pandas 的一些主要特性和功能:

1. 数据清理

Pandas 包提供了许多函数来清理和转换数据,例如填充缺失值、删除行或列、删除 NULL 值和重命名列。

2. 数据过滤和选择

Pandas 包提供了广泛的函数,用于基于高度精细的条件进行数据过滤和选择。因此,无论数据的复杂性如何,我们都可以使用 Pandas 提取所需的精确信息。

3. 数据聚合

借助 Pandas,我们可以执行聚合操作,例如 pivot、groupby 和 merge 来汇总和重构数据。

4. 数据可视化

Pandas 包与流行的 Matplotlib 库集成,用于数据可视化,允许用户从数据创建不同类型的绘图和图表。

使用 Pandas 包的一些优点

使用 Pandas 包进行数据分析和操作有许多原因,包括但不限于:

  1. 高效的数据处理: Pandas 提供了一个功能性框架,可以高效有效地处理大型数据集。该包建立在 NumPy 之上,确保更快、更高效的数值运算。
  2. 灵活性: Pandas 提供了一系列用于数据操作的函数和方法,使其成为各种数据科学家和分析师活动的灵活工具。
  3. 易于与其他库集成: Pandas 可以轻松高效地与 NumPy、Matplotlib 和 SciPy 等其他 Python 库集成,从而创建用于数据分析的强大管道。
  4. 可读性: Pandas 提供清晰简洁的语法,使代码易于阅读和理解。此功能确保了代码的轻松添加和维护,促进了与其他团队成员的顺畅协作,并提高了项目的寿命。
  5. 广泛采用和支持: Pandas 是数据科学社区中广泛使用的 Python 包。因此,在线论坛提供了大量的资源、教程和支持。
  6. 处理多样化的数据源: Pandas 可以高效处理来自多样化数据源的数据。此数据处理阶段包括读取和写入 Excel 文件、CSV 文件和 SQL 数据库等数据源。Pandas 是一个多功能包,是处理各种数据集和格式数据的流行解决方案。

Pandas 入门

现在让我们了解如何在 Python 中开始使用 Pandas 库。

安装 Pandas 并验证安装

使用 Pandas 的主要步骤是确保它已安装在系统中。我们可以通过在命令提示符或终端中键入以下命令来使用 PIP 安装程序安装 Pandas。

语法

安装完成后,我们可以通过创建新的 python 程序文件并导入 pandas 模块来验证 Pandas 库是否正确安装。

以下是说明相同内容的代码片段。

文件:verify.py

import pandas as pd

注意:在这里,pd 指的是 Pandas 的别名。但是,不必使用别名导入库,它只是有助于在每次调用方法或属性时编写更少的代码。

现在,让我们保存文件并在命令提示符或终端中运行以下命令。

语法

$ python verify.py

如果程序没有返回任何导入错误,则表示库已成功安装。如果出现任何异常,请尝试重新安装库并考虑查看其官方文档。

使用 Pandas 的第一个 Python 程序

现在 Pandas 包已正确安装在系统上,让我们在 Python 中编写第一个程序,使用 Pandas 创建一个 DataFrame

示例 1:使用 Pandas 创建 DataFrame

输出

DataFrame: Empty DataFrame
Columns: []
Index: []
DataFrame:             0
0           I
1        love
2    learning
3      Pandas
4        from
5  JavaTpoint

说明

在上面的代码片段中,我们导入了 pandas 模块作为 pd。然后我们调用了 DataFrame 类的构造函数。之后我们初始化了一个字符串列表。最后,我们对初始化的列表调用了 DataFrame 类的构造函数。作为列表,第一个 DataFrame 是空的。但是,第二个 DataFrame 包含多行多列,其中包含来自列表的数据。

要深入了解 Pandas,您可以访问 JavaTpoint 提供的 Pandas 教程

现在我们已经掌握了 Pandas 的基本知识,是时候深入了解 DataFrame.query() 方法了。

理解 Pandas DataFrame.query() 方法

pandas.DataFrame 类提供了一个名为 query() 的方法。此方法用于根据给定的表达式(单个或多个列条件)查询行并返回一个新的 DataFrame。我们还可以通过将 query() 方法的 inplace 参数设置为 True 来就地修改现有 DataFrame。这使用户能够高效地过滤和操作 DataFrame 的数据,而无需创建额外的副本。

以下是关于 DataFrame.query() 方法的一些要点:

  1. query() 方法根据指定条件从 DataFrame 过滤行。
  2. query() 方法提供了一种强大而简洁的语法来过滤 DataFrame 行,类似于 SQL 查询,从而提高了代码的可读性和可维护性。
  3. query() 还支持广泛的逻辑和比较运算符,例如 and、or、not、==、!=、>、<、>= 和 <=。

DataFrame.query() 方法的语法

DataFrame.query() 方法的语法如下:

语法

参数

  1. expr: expr 参数指定查询表达式字符串,它遵循 Python 条件表达式的语法。
  2. inplace: inplace 参数是一个布尔参数,用于更新现有 DataFrame。此参数的默认值为 False。
  3. **kwargs: **kwargs 参数允许将额外的关键字参数传递给查询表达式。它是一个可选参数。

返回值

此方法用于返回过滤后的 DataFrame。

现在让我们看一下 DataFrame.query() 方法的实现。

Pandas DataFrame.query() 方法的实现

在以下部分中,我们将查看不同的示例,说明如何使用 query() 方法过滤给定 DataFrame 中的数据。

示例 1:单条件过滤

在此示例中,数据根据单个条件进行过滤。在应用 query() 方法之前,我们将把列名中的空格替换为 '_'。

代码

输出

Unfiltered DataFrame
    First Name  Gender  Start Date Last Login Time  Salary  Bonus % Senior Management                  Team
0      Douglas    Male    8/6/1993        12:42 PM   97308    6.945              True             Marketing
1       Thomas    Male   3/31/1996         6:53 AM   61933    4.170              True                   NaN
2        Maria  Female   4/23/1993        11:17 AM  130590   11.858             False               Finance
3        Jerry    Male    3/4/2005         1:00 PM  138705    9.340              True               Finance
4        Larry    Male   1/24/1998         4:47 PM  101004    1.389              True       Client Services
..         ...     ...         ...             ...     ...      ...               ...                   ...
995      Henry     NaN  11/23/2014         6:09 AM  132483   16.655             False          Distribution
996    Phillip    Male   1/31/1984         6:30 AM   42392   19.675             False               Finance
997    Russell    Male   5/20/2013        12:39 PM   96914    1.421             False               Product
998      Larry    Male   4/20/2013         4:45 PM   60500   11.985             False  Business Development
999     Albert    Male   5/15/2012         6:24 PM  129949   10.169              True                 Sales

[1000 rows x 8 columns]
Filtered DataFrame
    First_Name  Gender  Start_Date Last_Login_Time  Salary  Bonus_% Senior_Management             Team
0      Douglas    Male    8/6/1993        12:42 PM   97308    6.945              True        Marketing
1       Thomas    Male   3/31/1996         6:53 AM   61933    4.170              True              NaN
3        Jerry    Male    3/4/2005         1:00 PM  138705    9.340              True          Finance
4        Larry    Male   1/24/1998         4:47 PM  101004    1.389              True  Client Services
6         Ruby  Female   8/17/1987         4:20 PM   65476   10.012              True          Product
..         ...     ...         ...             ...     ...      ...               ...              ...
991       Rose  Female   8/25/2002         5:12 AM  134505   11.051              True        Marketing
992    Anthony    Male  10/16/2011         8:35 AM  112769   11.625              True          Finance
993       Tina  Female   5/15/1997         3:53 PM   56450   19.040              True      Engineering
994     George    Male   6/21/2013         5:47 PM   98874    4.479              True        Marketing
999     Albert    Male   5/15/2012         6:24 PM  129949   10.169              True            Sales

[468 rows x 8 columns]

说明

在上面的代码片段中,我们导入了 pandas 模块。然后我们使用 CSV 文件创建了一个 DataFrame 并打印了 DataFrame 以供参考。然后我们将数据中的空格替换为下划线 '_',然后使用 filter() 方法过滤 DataFrame。最后,我们打印了过滤后的 DataFrame 以供参考。

结果,过滤后的数据中只有 Senior Management 设置为 True 的行。

示例 2:多条件过滤

在此示例中,DataFrame 已在多个条件下进行过滤。在应用 query() 方法之前,我们将把列名中的空格替换为 '_'。

代码

输出

Unfiltered DataFrame
    First Name  Gender  Start Date Last Login Time  Salary  Bonus % Senior Management                  Team
0      Douglas    Male    8/6/1993        12:42 PM   97308    6.945              True             Marketing
1       Thomas    Male   3/31/1996         6:53 AM   61933    4.170              True                   NaN
2        Maria  Female   4/23/1993        11:17 AM  130590   11.858             False               Finance
3        Jerry    Male    3/4/2005         1:00 PM  138705    9.340              True               Finance
4        Larry    Male   1/24/1998         4:47 PM  101004    1.389              True       Client Services
..         ...     ...         ...             ...     ...      ...               ...                   ...
995      Henry     NaN  11/23/2014         6:09 AM  132483   16.655             False          Distribution
996    Phillip    Male   1/31/1984         6:30 AM   42392   19.675             False               Finance
997    Russell    Male   5/20/2013        12:39 PM   96914    1.421             False               Product
998      Larry    Male   4/20/2013         4:45 PM   60500   11.985             False  Business Development
999     Albert    Male   5/15/2012         6:24 PM  129949   10.169              True                 Sales

[1000 rows x 8 columns]
Filtered DataFrame
    First_Name  Gender  Start_Date Last_Login_Time  Salary  Bonus_% Senior_Management       Team
43     Marilyn  Female   12/7/1980         3:16 AM   73524    5.207              True  Marketing
98        Tina  Female   6/16/2016         7:47 PM  100705   16.961              True  Marketing
158      Norma  Female   2/28/1999         8:45 PM  114412    8.756              True  Marketing
331     Evelyn  Female    9/3/1983         1:58 PM   36759   17.269              True  Marketing
446     Cheryl  Female   8/16/1994         8:33 AM   67150   15.850              True  Marketing
468     Janice  Female   6/28/1997         1:48 PM  136032   10.696              True  Marketing
531   Virginia  Female    5/2/2010         9:10 PM  123649   10.154              True  Marketing
617      Kathy  Female   1/14/2001         5:11 AM   45682    1.451              True  Marketing
625    Cynthia  Female   6/29/2015         6:38 AM   82408    8.701              True  Marketing
656       Lisa  Female    2/9/1982         6:44 PM  113592   17.108              True  Marketing
676      Annie  Female    6/6/1992        10:04 AM  138925    9.801              True  Marketing
730     Nicole  Female   4/26/2009        12:40 AM   66047   18.674              True  Marketing
811     Judith  Female    9/3/1989        11:16 AM  134048    6.818              True  Marketing
813     Evelyn  Female   2/10/2002         4:44 AM  123621   19.767              True  Marketing
894      Betty  Female  11/19/2002        10:40 AM   37005    7.645              True  Marketing
930      Nancy  Female   9/10/2001        11:57 PM   85213    2.386              True  Marketing
942       Lori  Female  11/20/2015         1:15 PM   75498    6.537              True  Marketing
991       Rose  Female   8/25/2002         5:12 AM  134505   11.051              True  Marketing

说明

在上面的代码片段中,我们导入了 pandas 模块。然后我们使用 CSV 文件创建了一个 DataFrame 并打印了 DataFrame 以供参考。然后我们将数据中的空格替换为下划线 '_',然后使用 filter() 方法过滤 DataFrame。最后,我们打印了过滤后的 DataFrame 以供参考。

结果,根据应用的过滤器只返回了 18 行。


下一个主题DataFrame.rename()