四时宝库

程序员的知识宝库

【Pandas】(5) eval和query(pandas query使用)

使用eval()进行高效计算

eval() 函数在 Pandas 中是一种高效率的字符串表达式求值器,允许对 DataFrame 进行快速计算。这个功能基于 Numexpr 库,能够加速某些特定类型的操作,尤其是在处理大型 DataFrame 时。

基本使用

eval() 允许你使用字符串表达式来执行算术运算、比较运算等操作。这些操作可以是两个 DataFrame 的列之间,也可以是 DataFrame 的列与标量之间的运算。

语法

pd.eval(expr, inplace=False)
  • expr: 字符串形式的表达式。
  • inplace: 如果为 True,则直接在原 DataFrame 上修改而不返回新的 DataFrame。默认为 False。

示例

首先,创建一个示例 DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10, 3), columns=['A', 'B', 'C'])

列与列之间的运算

使用 eval() 计算 DataFrame 中的两列之和,并将结果作为新列添加到 DataFrame 中。

df.eval('D = A + B', inplace=True)

列与标量之间的运算

可以对 DataFrame 中的列进行标量运算。

df.eval('E = A * 2', inplace=True)

复杂表达式

eval() 支持更复杂的表达式,包括使用 Python 的数学函数和条件表达式。

df.eval('F = np.sqrt(A) + np.log(B)', inplace=True)

过滤操作

eval() 还可以用来过滤 DataFrame,返回满足条件的行。

result = df.eval('A > 0.5')

局部变量

如果你想在 eval() 表达式中使用局部变量,可以通过 @ 符号引用它们。

threshold = 0.5
result = df.eval('A > @threshold')

使用query()进行高效查询

Pandas 的 query() 方法提供了一种查询 DataFrame 行的强大方式,使用布尔表达式作为查询字符串,这使得筛选复杂数据集变得简单直观。这个方法是基于 Numexpr 库实现的,能够提高某些查询操作的性能。

基本使用

query() 方法允许你使用字符串形式的查询表达式来筛选数据。

语法

DataFrame.query(expr, inplace=False, **kwargs)
  • expr: 一个字符串形式的查询表达式。
  • inplace: 如果为 True,则修改原 DataFrame 而不是返回一个新的 DataFrame。默认为 False。
  • **kwargs: 关键字参数,用于传递给 eval() 方法,例如, local_dictglobal_dict 用于在表达式中使用外部变量。

示例

首先,创建一个示例 DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': np.random.randint(1, 10, 5),
    'B': np.random.randint(1, 10, 5),
    'C': np.random.rand(5)
})

简单查询

使用 query() 根据列 A 的值筛选行:

result = df.query('A > 5')

复合条件查询

你可以在查询表达式中使用多个条件,结合 andor 逻辑操作符:

result = df.query('A > 5 and B < 8')

使用外部变量

如果你想在查询表达式中使用 Python 变量,可以通过在变量名前加 @ 符号来实现:

threshold = 5
result = df.query('A > @threshold')

使用索引查询

query() 方法也可以用于查询 DataFrame 的索引:

df.index.name = 'index'  # 给索引命名,方便在 query 中引用
result = df.query('index > 2')

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接