假设我有以下两个数据框:
data = {'ID1':['A3', 'A4'], 'ID2':['B2', 'B3']}
df1 = pd.DataFrame(data)
data2 = {'ID1':['A3','A3','A3', 'A4', 'A4','A4', 'B2','B2','B2', 'B3','B3','B3'],
'Stock':['x','y','z','x','y','z','x','y','z','x','y','z'],
'Weight':[0.2,0.1,0.3,0.2,0.1,0.15,0.05,0.07,0.2,0.1,0.3,0.2]}
df2 = pd.DataFrame(data2)
它们看起来像这样:
print(df1)
ID1 ID2
0 A3 B2
1 A4 B3
print(df2)
ID1 Stock Weight
0 A3 x 0.20
1 A3 y 0.10
2 A3 z 0.30
3 A4 x 0.20
4 A4 y 0.10
5 A4 z 0.15
6 B2 x 0.05
7 B2 y 0.07
8 B2 z 0.20
9 B3 x 0.10
10 B3 y 0.30
11 B3 z 0.20
我想告诉python在df2中搜索df1中的每一对(A3 <-> B2和A4 <-> B3)并执行以下操作:
对于这对货币对共有的所有股票,取两个权重中的最低者,然后将所有最低权重相加。
以数学方式进行说明:
其中“ i”是货币对的第一项,“ j”是货币对的第二项,“ k”代表股票,“ h”是货币对的交集。
对于df1中定义的每对,我希望python遍历df2中属于“ h”的每个“ k”,执行最小值的总和,然后将每对的结果显示在第三列中如果是df1。
请注意,在实际数据中,每件商品(例如A2)在df2中显示数百次-每只股票一次。但是,该对中的每个成员所持有的一组股票彼此不同。我只对这对两位成员都持有的股票感兴趣。
任何想法都会受到高度赞赏。
答案 0 :(得分:0)
您可以执行以下操作:
import pandas as pd
data = {"ID1": ["A3", "A4"], "ID2": ["B2", "B3"]}
df1 = pd.DataFrame(data)
data2 = {
"ID1": ["A3", "A3", "A3", "A4", "A4", "A4", "B2", "B2", "B2", "B3", "B3", "B3"],
"Stock": ["x", "y", "z", "x", "y", "z", "x", "y", "z", "x", "y", "z"],
"Weight": [0.2, 0.1, 0.3, 0.2, 0.1, 0.15, 0.05, 0.07, 0.2, 0.1, 0.3, 0.2],
}
df2 = pd.DataFrame(data2)
for A, B in zip(df1.ID1, df1.ID2):
A_search = df2.loc[df2["ID1"] == A]
B_search = df2.loc[df2["ID1"] == B]
merged_search = pd.merge(A_search, B_search, on=["Stock"], how="inner")
merged_search["multiplication"] = (
merged_search["Weight_x"] * merged_search["Weight_y"]
)
print(merged_search)
上面将打印:
ID1_x Stock Weight_x ID1_y Weight_y multiplication
0 A3 x 0.2 B2 0.05 0.010
1 A3 y 0.1 B2 0.07 0.007
2 A3 z 0.3 B2 0.20 0.060
ID1_x Stock Weight_x ID1_y Weight_y multiplication
0 A4 x 0.20 B3 0.1 0.02
1 A4 y 0.10 B3 0.3 0.03
2 A4 z 0.15 B3 0.2 0.03
现在,您的问题在您想进行乘法的 where 上有点混乱,因此对于上面的示例,我只是将weight
值乘以给定的两个{{ 1}} / ID1
变量。但是,您应该能够利用此答案的上下文来设置实际算术的格式。