返回

Pandas 高效行过滤指南:运算符链式与 query() 方法结合

python

使用运算符链式过滤 Pandas DataFrame 行

引言

在 Pandas 中,我们经常需要根据特定条件过滤 DataFrame 中的行。传统的方法是使用方括号索引,但这既麻烦又冗长。本文将介绍一种更简洁、更高效的方法:使用运算符链式与 query() 方法。

子标题 1:运算符链式的局限性

运算符链式允许我们使用管道(|)连接多个操作,从而创建更复杂的操作。然而,在过滤行时,运算符链式无法独立使用。我们需要将 DataFrame 赋值给一个变量,然后使用方括号索引来过滤行。

子标题 2:query() 方法

query() 方法使我们能够使用更直观、简洁的语法来过滤行。我们可以将运算符和值作为参数传递给 query() 方法,而无需手动编写索引表达式。

df_filtered = df.query("column == value")

这种方法可以更轻松地过滤行,特别是当涉及更复杂的条件时。

子标题 3:高级过滤操作

除了基本的过滤之外,query() 方法还支持高级过滤操作,例如:

  • 过滤多个值的行:df.query("column in ['A', 'B']")
  • 过滤满足多个条件的行:df.query("column > 10 and age < 30")
  • 使用 isin() 方法过滤包含特定值列表的行
  • 使用 between() 方法过滤值在指定范围内的行

子标题 4:实战示例

让我们考虑一个包含客户数据的 DataFrame:

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve'],
    'age': [25, 30, 28, 32, 29],
    'city': ['New York', 'London', 'Paris', 'Berlin', 'Madrid']
})

要过滤年龄大于 30 岁且居住在伦敦的客户,我们可以使用:

df_filtered = df.query("age > 30 and city == 'London'")

结论

运算符链式与 query()isin()between() 方法的结合使我们在 Pandas 中过滤 DataFrame 行变得更加灵活和高效。我们可以使用更直观的语法过滤行,而无需手动编写冗长的索引表达式。

常见问题解答

  1. 为什么使用 query() 方法比方括号索引更好?

    query() 方法使用更直观、简洁的语法,支持更高级的过滤操作,并且可以与运算符链式结合使用,从而实现更灵活的过滤。

  2. 我可以使用 query() 方法过滤 DataFrame 中的列吗?

    否,query() 方法用于过滤行,而不能过滤列。要过滤列,请使用 lociloc 索引器。

  3. isin()between() 方法有什么区别?

    isin() 方法用于过滤包含特定值列表的行,而 between() 方法用于过滤值在指定范围内的行。

  4. 我可以使用 query() 方法与 groupby()aggregate() 函数结合使用吗?

    是的,query() 方法可以与 groupby()aggregate() 函数结合使用,实现更复杂的数据分析和过滤。

  5. 在什么情况下应该使用 query() 方法,在什么情况下应该使用方括号索引?

    如果需要进行简单、基本的过滤,可以使用方括号索引。对于更复杂、需要使用高级过滤操作的过滤,应使用 query() 方法。