迭代一个 df 并将值乘以另一个 df 的值

iterate over a df and multiply the values by the values of another df

我的 df1 看起来像 this:It 包含 3 个独特的项目 iddate 开始于 01-01-22 并结束于01-12-28

id date p50 p90
apv1 01-01-22 1000 1000
apv2 01-01-22 1000 1000
tsso 01-01-22 1202 2005
apv1 01-02-22 1000 2000
apv2 01-02-22 1400 5000
tsso 01-02-22 200 1000
. . . .
. . . .
. . . .
apv1 01-11-28 305 400
apv2 01-11-28 300 200
tsso 01-11-28 250 499
apv1 01-12-28 100 290
apv2 01-12-28 145 650
tsso 01-12-28 299 179

df2 看起来像这样:

mth month pct
01 january 0.042
02 febuary 0.055
03 march 0.089
04 april 0.097
05 may 0.10
06 june 0.11
07 july 0.127
08 august 0.114
09 sept 0.091
10 oct 0.068
11 nov 0.043
12 dec 0.038

我想将 df1 的每个值 p50 乘以 df2 的值 pct mthmonth 值等于 df1date 的月份。 p90.

同样

最终 df 应该是这样的:

id date p50 p90
apv1 01-01-22 1000*0.042 1000*0.042
apv2 01-01-22 1000*0.042 1000*0.042
tsso 01-01-22 1202*0.042 2005*0.042
apv1 01-02-22 1000*0.055 2000*0.055
apv2 01-02-22 1400*0.055 5000*0.055
tsso 01-02-22 200*0.055 1000*0.055
. . . .
. . . .
. . . .
apv1 01-11-28 305*0.043 400*0.043
apv2 01-11-28 300*0.043 200*0.043
tsso 01-11-28 250*0.043 499*0.043
apv1 01-12-28 100*0.038 290*0.038
apv2 01-12-28 145*0.038 650*0.038
tsso 01-12-28 299*0.038 179*0.038

只需 assign 月列使用日期列。然后按月 merge 两个数据帧。最后,运行 与需要的列相乘:

final_df = (
    df1.assign(mth = lambda x: pd.to_datetime(x["date"]).dt.strftime("%m"))
       .merge(df2, on="mth")
       .assign(
           p50 = lambda x: x["p50"].mul(x["pct"]),
           p90 = lambda x: x["p90"].mul(x["pct"])
       )
)

您应该能够使用 map 来修改您的数据:

s = df2.set_index('mth')['pct']
pct = pd.to_datetime(df1['date']).dt.strftime('%m').map(s)

df1[['p50', 'p90']] *= pct