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
我必须支持用户 运行 任何针对框架的公式来生成新列的能力。
我可能有一个框架看起来像
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