Pandas 应用 eval,当 NAN 在列中计算时不给出 NAN 作为结果

Pandas apply with eval not giving NAN as result when NAN in column its calculating on

我必须支持用户 运行 任何针对框架的公式来生成新列的能力。

我可能有一个框架看起来像

    dim01    dim02   msr01
0   A        25      1.0
1   B        26      5.3
2   C        53      NaN

我解释用户代码以允许他们运行使用支持的函数/标准运算符/其他列的公式

所以公式可能类似于 SQRT([msr01]*100+7)

我将用户输入转换为 Python 语法,因此计算结果类似于

formula_str = '(math.sqrt((row.msr01*100)+7))'

然后我将它应用到我的 pandas 数据框,就像这样

data_frame['msr002'] = data_frame.apply(lambda row: eval(formula_str), axis=1)

在我在计算中使用的列中使用 NaN 命中数据之前,这一直很好用。我注意到当这种情况发生时,我在 return.

中得到了这样的框架
    dim01    dim02   msr01   msr02
0   A        25      1.0     10.344
1   B        26      5.3     23.173
2   C        53      NaN     7.342

看来 eval 没有正确计算 NaN。

我正在使用 lexer/parser 来确保用户发送的公式没有危险,并将日常用户语法转换为使用 python 函数并使其适用于 pandas 列。 关于如何解决这个问题有什么建议吗?

也许我应该在 lambda 中包含一些东西,看看是否有任何必需的列是 NaN 并且在这种情况下只是硬编码为 Nan?但这对我来说似乎不是最好的解决方案。

我确实看到了 类似的内容,但认为它不能满足我的确切需求。

所以你可以试试

df.msr01.mul(100).add(7)**0.5
Out[716]: 
0    10.34408
1    23.17326
2         NaN
Name: msr01, dtype: float64

还有你的原码

df.apply(lambda row: eval(formula_str), axis=1)
Out[714]: 
0    10.34408
1    23.17326
2         NaN
dtype: float64