我有一個具有這種基本形式的 pandas DataFrame (df_A):
|id| alt| a | b | c | d | e |
|--|----|-----|-----|-----|---|---|
| 0| ICV| 0.2 | 1.0 | 0.2 | 0 | 1 |
| 1| ICV| 1.0 | 1.0 | 0.2 | 0 | 0 |
| 2| BEV| 3.2 | 1.0 | 0.2 | 1 | 0 |
| 3| ICV| 2.0 | 1.0 | 0.2 | 0 | 0 |
| 4| BEV| 2.0 | 1.0 | 0.2 | 1 | 1 |
此外,我還有另一個 DataFrame (df_B):
|id| alt| a | b | c |
|--|----|-----|-----|-----|
| 0| ICV| 0.1 | 0.3 | 0.5 |
| 1| BEV| 0.2 | 0.4 | 0.6 |
我想要做的是將第二個 DataFrame 的值與第一個 DataFrame 的值相乘,其中 alt 值相同。我也不希望 d 或 e 列參與乘法。所以我想要一個像這樣的DataFrame(df_C):
|id| alt| a | b | c | d | e |
|--|----|---------|---------|---------|---|---|
| 0| ICV| 0.2*0.1 | 1.0*0.3 | 0.2*0.5 | 0 | 1 |
| 1| ICV| 1.0*0.1 | 1.0*0.3 | 0.2*0.5 | 0 | 0 |
| 2| BEV| 3.2*0.2 | 1.0*0.4 | 0.2*0.6 | 1 | 0 |
| 3| ICV| 2.0*0.1 | 1.0*0.3 | 0.2*0.5 | 0 | 0 |
| 4| BEV| 2.0*0.2 | 1.0*0.4 | 0.2*0.6 | 1 | 1 |
我嘗試了一些不成功的事情:
list = ["a","b","c"]
df_C = df_A.copy()
for i in ["BEV","ICV"]:
df_C[list].loc[df_C["alt"]==i] = df_A[list ["alt"]].loc[df_A["alt"]==i].drop(["alt"],axis=1).mul(df_B[df_B["alt"]==i].drop(["alt"],axis=1).to_numpy(),axis=1)
這只是回傳原始資料幀(df_A)。我知道我的方法存在嚴重缺陷,但我想不出任何方法來做到這一點。
uj5u.com熱心網友回復:
您可以使用merge和就地乘法:
cols = ['a', 'b', 'c']
df_A[cols] *= df_A[['alt']].merge(df_B, how='left')[cols]
輸出:
id alt a b c d e
0 0 ICV 0.02 0.3 0.10 0 1
1 1 ICV 0.10 0.3 0.10 0 0
2 2 BEV 0.64 0.4 0.12 1 0
3 3 ICV 0.20 0.3 0.10 0 0
4 4 BEV 0.40 0.4 0.12 1 1
中間的:
df_A[['alt']].merge(df_B, how='left')[cols]
a b c
0 0.1 0.3 0.5
1 0.1 0.3 0.5
2 0.2 0.4 0.6
3 0.1 0.3 0.5
4 0.2 0.4 0.6
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/488324.html
