无需迭代即可对两个数据帧进行硬匹配

时间:2019-10-08 14:07:19

标签: python pandas iteration

我有以下具有约3000行的独特汽车的数据框(df_inventory):

    stock_id  car_brand   car_model     age_group      mileage_group
    AS12354   Mazda       CX-7          6-10           50-100k
    DX22234   Toyota      Verso         11>            150k>
    KL32423   Volkswagen  Touran        11>            150k>
    SU12121   Renault     Twingo        6-10           50-100k
    ...       ...         ...           ...            ...

然后有以下数据帧(df_main)(大约)100000行的(独特)汽车:

    clientID  car_brand   car_model     age_group      mileage_group
    23132     Volkswagen  Golf          6-10           50-100k
    24234     Renault     Twingo        11>            150k>
    19055     Volkswagen  Polo          11>            150k>
    23245     Renault     Clio          1-2            0-50k
    ...       ...         ...           ...            ...

最后我想得到的是一个有两列的数据框。一个将是clientID,第二个将是Stock_id 如果所有其他列(car_brand,car_model,age_group,mileage_group)上都存在硬匹配。

这可以使用两个for循环来实现,该循环迭代stock_id和clientID之间的每个组合。但这导致3000 * 100000次迭代,并且需要花费大量时间:

clientID=[]
stock_id=[]

for i in range(df_main.shape[0]):
        for j in range(df_inventory.shape[0]):

            if (df_main.iloc[i,1]==df_inventory.iloc[j,1] 
            and df_main.iloc[i,2]==df_inventory.iloc[j,2]
            and df_main.iloc[i,3]==df_inventory.iloc[j,3]
            and df_main.iloc[i,4]==df_inventory.iloc[j,4] ):

                        clientID.append(df_main.iloc[i,0])
                        stock_id.append(df_inventory.iloc[j,0])

例如,是否有任何Python方式(列表理解)可以使此过程更快?

1 个答案:

答案 0 :(得分:0)

非常感谢,最终这非常简单:

merged = df_main.merge(df_inventory, how='inner', on=['car_brand', 
'car_main_type','car_age_years_group','mileage_group'])