使用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_dict 和 global_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')
复合条件查询
你可以在查询表达式中使用多个条件,结合 and、 or 逻辑操作符:
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')