如何在Pandas的df.eval字符串中调用np.where及自定义函数?
在Pandas DataFrame.eval中调用外部函数的解决方案
1. 调用numpy.where的正确写法
你尝试的@np.where写法本身是可行的,以下是可正常运行的完整代码:
import pandas as pd import numpy as np data = [[0,10,10],[1,20,20],[0,30,30]] df = pd.DataFrame(data,columns=['X','A','B']) # 正确的eval调用np.where方式 df['C'] = df.eval('@np.where(X == 0, A + B, 0)') print(df)
运行后输出:
X A B C 0 0 10 10 20 1 1 20 20 0 2 0 30 30 60
原理:@符号用于在eval的字符串表达式中引用外部命名空间中的对象(包括函数),X、A、B作为DataFrame的列,属于eval的本地上下文,可直接使用。
若你的环境中该写法报错,建议检查Pandas版本(需≥0.13.0,此版本开始支持@引用外部对象),或确认numpy是否正确导入。
2. 调用自定义函数的方法
如果要在eval中调用自定义函数,同样用@引用,且函数需支持处理Series类型的输入:
# 定义支持Series输入的自定义函数 def custom_calc(x, a, b): return np.where(x == 0, a + b, 0) # 在eval中调用自定义函数 df['C'] = df.eval('@custom_calc(X, A, B)') print(df)
输出结果与之前一致。注意:自定义函数必须适配Pandas Series的批量运算逻辑,因为eval中传递的列都是Series对象。
常见问题说明
- 直接写
np.where不加@会报错,因为eval默认上下文不包含外部库的函数,必须用@显式引入。 - 确保函数参数与
eval中传递的列名匹配,且函数逻辑能处理批量数据。
内容的提问来源于stack exchange,提问作者Zach Kramer
相关产品推荐
相关产品推荐

