Pandas在查询后使用理解进行赋值

im9ewurl  于 2023-06-04  发布在  其他
关注(0)|答案(1)|浏览(138)

我想在pandas中使用assign,在pandas查询后传递字典理解。
可重复的示例:

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.query("b > 4").assign(
    **{
        f"weighted_{metric}": lambda df: df[metric] * df["weight"]
        for metric in metrics
    }
)
print(df)

结果:

a  b  weight  weighted_a  weighted_b
1  2  5     0.2         1.0         1.0
2  3  6     0.3         1.8         1.8

我没有得到预期的结果,对于a,我应该得到0.2,0.3。
你知道我怎样才能得到正确的weighted_a吗?
我在here中问了一个类似的问题,那里的解决方案工作得很好,但以前没有查询。有没有想过如何以流水线的方式调整另一个问题的答案?
请记住,对于我的用例,可能会使用一个比乘法更复杂的函数。

rjee0c15

rjee0c151#

你必须将metric作为参数传递给lambda,否则它将采用最后一次出现的值:

df = df.query("b > 4").assign(
    **{
        f"weighted_{metric}": lambda x, metric=metric: x[metric] * x["weight"]
        for metric in metrics
    }
)

输出:

a  b  weight  weighted_a  weighted_b
1  2  5     0.2         0.4         1.0
2  3  6     0.3         0.9         1.8

相关问题