迭代一个 df 并将值乘以另一个 df 的值
iterate over a df and multiply the values by the values of another df
我的 df1 看起来像 this:It 包含 3 个独特的项目 id
。date
开始于 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
mth
或 month
值等于 df1 中 date
的月份。 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
我的 df1 看起来像 this:It 包含 3 个独特的项目 id
。date
开始于 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
mth
或 month
值等于 df1 中 date
的月份。 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