【问题标题】:PYTHON - Create LAMBDA function inside function from user string to use on Pandas ApplyPYTHON - 从用户字符串创建函数内部的 LAMBDA 函数以在 Pandas 上使用
【发布时间】:2021-04-16 09:49:21
【问题描述】:

好吧,我知道很多人会问“为什么要让人们创建代码?”然后说“不要在字符串上使用 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(),它允许您在之后运行 Apply,问题似乎是在 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 方式。

【问题讨论】:

  • “我希望我的用户通过提供 IF THEN ELSE 语句来产生覆盖” 这样做您解决了什么问题?您真正需要多大的灵活性?为什么?
  • @KarlKnechtel 因为这是要求。这是一个技术问题,而不是哲学问题。
  • 我不知道您试图在“技术”和“哲学”问题之间做出什么区分,但是没有实际考虑和解决抽象编程问题这样的事情 证明要求的合理性。无论如何,除非你正在参加比赛或作业。

标签: python pandas exec apply


【解决方案1】:

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

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

查看eval了解更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 2018-04-25
    • 1970-01-01
    • 2020-03-21
    • 2020-01-16
    • 2020-11-08
    • 2017-07-14
    • 2019-12-10
    相关资源
    最近更新 更多