【发布时间】: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)