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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:27:49