PYTHON - 在函数内部从用户字符串创建 LAMBDA 函数以用于 Pandas 应用

PYTHON - Create LAMBDA function inside function from user string to use on Pandas Apply

好的,我知道很多人会问“为什么要让人们创建代码?”然后说“不要对字符串使用 exec!”所以这是想法:

这将是一个例子:

import pandas as pd

If = 'x.b > 2'
Then = 'x.a + 10'
Else = 'x.a'

s = f"MyFunc = lambda x: {Then} if {If} else {Else}"

Df = pd.DataFrame({'a':[1, 1, 1, 2, 2, 2], 'b':[1, 2, 3, 4, 5, 6]})

def RunApply(Df, s):
    exec(s)
    return Df.apply(MyFunc, axis=1)

RunApply(Df, s)

我也试过:

def RunApply(Df, s):
    Compiled = compile(s, 'MyString', 'exec')
    exec(Compiled)
    return Df.apply(MyFunc, axis=1)

两种情况下的输出都是:

NameError: name 'MyFunc' is not defined

如果你 运行 终端上的 exec() 它允许你 运行 之后应用到问题似乎是 运行 在 Def 中。我确信这之前已经解决了,但我发现的许多解决方案都是针对该人遇到的特定问题定制的。在我的例子中,它是生成我想要的 IF..THEN..ELSE 代码 运行 很高兴听到其他可能不涉及 EXEC 的方法。

谢谢!

更新:

Amit 推荐给 运行:

import pandas as pd

If = 'x.b > 2'
Then = 'x.a + 10'
Else = 'x.a'

s = f"lambda x: {Then} if {If} else {Else}"

Df = pd.DataFrame({'a':[1, 1, 1, 2, 2, 2], 'b':[1, 2, 3, 4, 5, 6]})

def RunApply(Df, s):
    Compiled = compile(s, 'MyString', 'eval')
    MyFunc = eval(Compiled)
    return Df.apply(MyFunc, axis=1)

RunApply(Df, s)

这可行,但对其他方法感兴趣,以防我们缺少正确的 pythonic 方法。

您可以使用 eval 方法来评估您的表达式。 检查以下代码:

s = f"lambda x: {Then} if {If} else {Else}"
MyFunc = eval(s)

查看eval了解更多信息