Pandas中用字典推导式调用assign计算加权列结果异常,求修正
Pandas assign结合字典推导式生成加权列结果异常的解决方法
问题重现
你尝试用assign方法结合字典推导式生成加权列,但所有加权列都使用了最后一个metric的计算逻辑,导致结果不符合预期:
错误代码
import pandas as pd df = pd.DataFrame({ "a": [1, 2, 3], "b": [4, 5, 6], "weight": [0.1, 0.2, 0.3] }) metrics = ["a", "b"] df = df.assign( **{ f"weighted_{metric}": lambda df: df[metric] * df["weight"] for metric in metrics } ) print(df)
错误输出
a b weight weighted_a weighted_b 0 1 4 0.1 0.4 0.4 1 2 5 0.2 1.0 1.0 2 3 6 0.3 1.8 1.8
问题原因
字典推导式中的lambda表达式采用延迟绑定:当assign执行这些lambda时,才会去读取metric变量的值,此时循环已经结束,metric固定为最后一个元素"b",因此所有加权列都计算成了df["b"] * df["weight"]。
解决方案
方法1:用闭包固定变量
通过嵌套lambda创建闭包,提前绑定当前循环的metric值:
import pandas as pd df = pd.DataFrame({ "a": [1, 2, 3], "b": [4, 5, 6], "weight": [0.1, 0.2, 0.3] }) metrics = ["a", "b"] df = df.assign( **{ f"weighted_{metric}": (lambda m: lambda df: df[m] * df["weight"])(metric) for metric in metrics } ) print(df)
方法2:直接计算列值(推荐)
跳过lambda,直接在字典推导式中生成每个加权列的Series,避免延迟绑定问题:
import pandas as pd df = pd.DataFrame({ "a": [1, 2, 3], "b": [4, 5, 6], "weight": [0.1, 0.2, 0.3] }) metrics = ["a", "b"] weighted_columns = {f"weighted_{m}": df[m] * df["weight"] for m in metrics} df = df.assign(**weighted_columns) print(df)
正确输出
a b weight weighted_a weighted_b 0 1 4 0.1 0.1 0.4 1 2 5 0.2 0.4 1.0 2 3 6 0.3 0.9 1.8
内容的提问来源于stack exchange,提问作者David Masip
相关产品推荐
相关产品推荐

