You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:39:15