【问题标题】:Using local variables with multiple assignments with pandas eval function通过 pandas eval 函数使用具有多个赋值的局部变量
【发布时间】:2017-06-24 01:38:53
【问题描述】:

熊猫帮助文件说(用于评估): 为方便起见,可以使用多行字符串执行多个赋值。

但是,我发现这不适用于变量(使用 ipython):

这行得通:

df_price.eval("op = op * @mult", inplace = True)

但这不起作用(op、cl、hi、lo 是数据帧 df_price 中的 cols,其中 mult 是浮点数):

df_price.eval("""op = op * @mult
              cl = cl * @mult
              hi = hi * @mult
              lo = lo * @mult""", inplace = True)

错误: pandas.computation.ops.UndefinedVariableError: 局部变量 'mult' 未定义

【问题讨论】:

  • 我已经提交了一个针对这个问题的修复请求。查看更新的答案。
  • 感谢您提交修复。
  • 该修复已合并到 main 并标记为里程碑 0.20.0 的一部分。干杯。
  • 这很快,谢谢。

标签: python python-3.x pandas


【解决方案1】:

我可以确认局部变量似乎只适用于多行 eval 表达式的第一行。一种可能的解决方法:

df_price.eval("""mult = @mult
              op = op * mult
              cl = cl * mult
              hi = hi * mult
              lo = lo * mult""", inplace = True)

但是,这确实有创建额外列的副作用。

更新:

我已经提交了一个Pull Request 来解决这个问题。

【讨论】:

  • 谢谢。在这种情况下,在将字符串传递给 eval 之前,我将进行字符串替换以将 mult 替换为其值。无论如何,还没有调查这是否比四个单独的 eval 语句快。三引号很笨重——我想说用分号分隔它们更好,或者允许一个列表:df_price.eval(["op = op * @mult", "cl = cl * @mult"],就地=真)
  • 您的列表示例只需要添加一个联接:df.eval("\n".join(..my_list..))
  • 好点,应该可以。但是,我仍然认为应该将 eval 更改为不需要换行符来处理多个命令——列表分离就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
相关资源
最近更新 更多