使用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
相关产品推荐
相关产品推荐

