PYTHON - 在函数内部从用户字符串创建 LAMBDA 函数以用于 Pandas 应用
PYTHON - Create LAMBDA function inside function from user string to use on Pandas Apply
好的,我知道很多人会问“为什么要让人们创建代码?”然后说“不要对字符串使用 exec!”所以这是想法:
- 我希望我的用户通过提供 IF THEN ELSE 语句来生成覆盖
- 它被解析为 Lambda 函数
- 然后使用 apply
将其应用于 DataFrame
这将是一个例子:
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了解更多信息
好的,我知道很多人会问“为什么要让人们创建代码?”然后说“不要对字符串使用 exec!”所以这是想法:
- 我希望我的用户通过提供 IF THEN ELSE 语句来生成覆盖
- 它被解析为 Lambda 函数
- 然后使用 apply 将其应用于 DataFrame
这将是一个例子:
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了解更多信息