You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pd.assign+字典推导式批量生成差值列结果异常求助

问题原因与解决方案

核心问题:Lambda的延迟绑定

你遇到的问题是Python lambda函数的延迟绑定特性导致的:

  • 字典推导式中定义的lambda不会在循环过程中立即捕获key和value的当前值,而是在lambda被实际调用(也就是df.assign()执行时)才去读取这两个变量的最终值。
  • 循环结束后,key和value停留在最后一组键值对'E'和'F'上,因此所有lambda函数都会用这对值计算,导致所有新列结果一致。

不管是用eval的写法还是直接引用key/value的写法,本质问题都是一样的:lambda内部的变量引用是延迟解析的。


正确的解决方法

方法1:用默认参数绑定当前值

通过给lambda添加默认参数,让它在定义时就捕获循环当前的key和value:

import pandas as pd

df = pd.DataFrame({
    'A': [2, 3],
    'B': [1, 4],
    'C': [3, 5],
    'D': [5, 6],
    'E': [2, 3],
    'F': [2, 5]
})

column_mapping = {'A': 'B', 'C': 'D', 'E': 'F'}

# 用默认参数绑定循环时的key和value
kwargs = {
    f"{key}_diff": lambda df, k=key, v=value: (df[k] - df[v]) / df[k]
    for key, value in column_mapping.items()
}

result_df = df.assign(**kwargs)
print(result_df.round(2))

方法2:用函数工厂生成计算函数

写一个专门的函数来创建对应的计算lambda,通过闭包特性捕获当前的key和value:

def create_diff_calculator(key, value):
    # 闭包捕获当前的key和value
    return lambda df: (df[key] - df[value]) / df[key]

kwargs = {
    f"{key}_diff": create_diff_calculator(key, value)
    for key, value in column_mapping.items()
}

result_df = df.assign(**kwargs)
print(result_df.round(2))

预期输出

两种方法都会得到正确的结果:

A  B  C  D  E  F  A_diff  C_diff  E_diff
0  2  1  3  5  2  2    0.50   -0.67     0.00
1  3  4  5  6  3  5   -0.33   -0.20    -0.67

内容的提问来源于stack exchange,提问作者geds133

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:12:53