在使用第二个df作为参考时,如何比较同一大熊猫df中的两组不同数据?

时间:2019-10-27 16:03:52

标签: python pandas dataframe

假设我有以下两个数据框:


    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)并执行以下操作:

对于这对货币对共有的所有股票,取两个权重中的最低者,然后将所有最低权重相加。

以数学方式进行说明:

enter image description here

其中“ i”是货币对的第一项,“ j”是货币对的第二项,“ k”代表股票,“ h”是货币对的交集。

对于df1中定义的每对,我希望python遍历df2中属于“ h”的每个“ k”,执行最小值的总和,然后将每对的结果显示在第三列中如果是df1。

请注意,在实际数据中,每件商品(例如A2)在df2中显示数百次-每只股票一次。但是,该对中的每个成员所持有的一组股票彼此不同。我只对这对两位成员都持有的股票感兴趣。

任何想法都会受到高度赞赏。

1 个答案:

答案 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变量。但是,您应该能够利用此答案的上下文来设置实际算术的格式。