【问题标题】:Merging Pandas and keeping only matching records合并 Pandas 并仅保留匹配的记录
【发布时间】:2019-08-10 12:16:48
【问题描述】:

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

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

假设我有这 2 个数据框:
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,从而在 df2 中添加 df1 的数据),同时只保留匹配的记录,以便输出数据帧为:

 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) 的第一个条目

再次感谢您的帮助!

【问题讨论】:

  • 从您发布的链接中:“INNER JOIN 由...表示”这不是您想要的吗?
  • pd.merge(df1, df2, on='AQROUTES_3') ?

标签: python pandas merge match


【解决方案1】:

如果您想获得预期的结果,合并键必须至少在数据框的一侧是唯一的。这个想法是在某些方面“创建”一个唯一的密钥。为了证明这一点,我在df1 中编造了E_ID 列:

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_EE_ID 两列的组合不是唯一的,则可能无法一概而论,但我希望您有所了解。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2019-05-13
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多