合并熊猫并仅保留匹配的记录

时间:2019-03-19 21:07:11

标签: python pandas merge match

我想这已经被涵盖了,但是我似乎在帖子中找不到有关合并和加入熊猫(Pandas Merging 101)的信息

我基本上有2个PANDAS,只想根据它们的匹配记录来合并它们。 例如:

假设我有这两个数据框:
df1:

                 AQROUTES_3          ...            Indice de performance
0               Autoroute15          ...                         0.696118
1              AvenuedAnjou          ...                         1.954598
2              AvenuedAnjou          ...                         1.632500
3              AvenuedAnjou          ...                         1.831760
4           RangSaint_Andre          ...                         1.350640
5          AvenuedePicardie          ...                         2408.779

df2:

  FID                  AQROUTES_3    ...         BEARING       E_ID
751    751                AvenuedAnjou    ...      156.554001     Anjou5
723    723                AvenuedAnjou    ...      156.554001    Anjou10
692    692                AvenuedAnjou    ...      156.554001    Anjou15
12      12             RangSaint_Andre    ...      140.352997   SaintA10
1141  1141            AvenuedePicardie    ...      359.289001   Picardi5

我想将它们合并在一起(将df1合并到df2,从而将df1的数据添加到df2中),同时仅保留匹配的记录,以使输出数据帧为:

 FID         AQROUTES_3       ...   BEARING      E_ID   Indice de performance
 751    751  AvenuedAnjou     ...   156.554001  Anjou5      1.954598
 723    723  AvenuedAnjou     ...   156.554001  Anjou10     1.632500
 692    692  AvenuedAnjou     ...   156.554001  Anjou15     1.831760
 12      12  RangSaint_Andre  ...   140.352997  SaintA10    1.350640
 1141  1141  AvenuedePicardie ...   359.289001  Picardi5    2408.779

请注意,由于记录未在df2.AQROUTES_3中找到匹配项,因此尚未合并df1的第一个条目(Autoroute15)。

再次感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果要获得预期的结果,则合并键在数据帧的至少一侧必须唯一。这个想法是以某种方式“创建”唯一的密钥。为了证明这一点,我在E_ID的{​​{1}}列中进行了弥补:

df1

df1

AQROUTES_3 Indice de performance E_ID 0 Autoroute15 0.696118 NaN 1 AvenuedAnjou 1.954598 Anjou5 2 AvenuedAnjou 1.632500 Anjou10 3 AvenuedAnjou 1.831760 Anjou15 4 RangSaint_Andre 1.350640 SaintA10 5 AvenuedePicardie 2408.779000 Picardi5

df2

在这种情况下,下面的代码将起作用。

    FID        AQROUTES_3     BEARING      E_ID
0   751      AvenuedAnjou  156.554001    Anjou5
1   723      AvenuedAnjou  156.554001   Anjou10
2   692      AvenuedAnjou  156.554001   Anjou15
3    12   RangSaint_Andre  140.352997  SaintA10
4  1141  AvenuedePicardie  359.289001  Picardi5

当然,这是本地化的解决方案,如果两列In [4]: df1['KEY'] = df1['AQROUTES_3'] + '_' + df1['E_ID'] #create a unique key ...: df2['KEY'] = df2['AQROUTES_3'] + '_' + df2['E_ID'] #create a unique key ...: df2.drop(['AQROUTES_3', 'E_ID'], axis=1, inplace=True) #no longer needed ...: df3 = pd.merge(df1, df2, on='KEY', how='right').drop('KEY', axis=1) #merge ...: df3 = df3[['FID', 'AQROUTES_3', 'BEARING', 'E_ID', 'Indice de performance']] #arrange columns ...: df3 Out[4]: FID AQROUTES_3 BEARING E_ID Indice de performance 0 751 AvenuedAnjou 156.554001 Anjou5 1.954598 1 723 AvenuedAnjou 156.554001 Anjou10 1.632500 2 692 AvenuedAnjou 156.554001 Anjou15 1.831760 3 12 RangSaint_Andre 140.352997 SaintA10 1.350640 4 1141 AvenuedePicardie 359.289001 Picardi5 2408.779000 AQROUTES_E的组合不是唯一的,则可能无法一概而论,但我希望您有所想法。

希望这会有所帮助。