【问题标题】:Using a dictionary of lambda functions in pandas.assign() gives the wrong result. How to avoid the lazy binding?在 pandas.assign() 中使用 lambda 函数字典会给出错误的结果。如何避免惰性绑定?
【发布时间】:2022-12-12 08:16:46
【问题描述】:

我想用熊猫修改多列。

import pandas as pd
df = pd.DataFrame({'a': [1,2], 'b':[3,4]})
df = df.assign(**{v: lambda x:x[v]*10 for v in ['a', 'b']})

不返回预期的结果。

10 30
20 40

它返回

30 30
40 40

据我了解,这是由于延迟绑定造成的,在这里解释:https://sopython.com/wiki/Common_Gotchas_In_Python

可以通过适当的功能获得所需的结果。

def fun(x):
    return x*10

df[['a','b']] = df[['a','b']].apply(fun)

有没有办法打破像上面这样的字典理解中的惰性绑定?还是 lambda 函数太有限?

【问题讨论】:

  • 你试过了吗:df.assign(**{v: lambda x,v=v:x[v]*10 for v in ['a', 'b']})? (注意v=v
  • 我认为 sopython 上的惰性绑定示例确实显示了这一点 - 但如果该示例不是那么清楚,我可能会考虑更新它......
  • 鉴于你的例子......你最好使用df *= 10......
  • @JonClements 第一个评论是我可以接受的答案。 (我会错过在浏览 sopython 代码时在 lambda 中使用两个变量的想法)。背景:同意, df *= 10 甚至更短。我在重构数​​据清理管道并将其隔离到上面的玩具示例时遇到了这个问题。
  • 是的...那么可能是个傻瓜...如果您对如何改进 sopython 上的页面有任何建议,这会让它更清晰 - 我很乐意进行编辑(我是网站 :p)

标签: python pandas lambda


【解决方案1】:

正如@jon-clements 的正确评论:

df.assign(**{v: lambda x,v=v:x[v]*10 for v in ['a', 'b']}) ?

在主题How does python dict comprehension work with lambda functions inside的答案中解释

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    相关资源
    最近更新 更多