代码之家  ›  专栏  ›  技术社区  ›  Sudhi

使用中dataframe1中一列的值查找dataframe2中特定列的值

  •  1
  • Sudhi  · 技术社区  · 6 年前

    我在网上搜索了一下。我没有找到我要找的确切病例。

    >>> df1
             ID       Item
    0  0667170D      Apple
    1  0644304D     Orange
    2  0655323D  Pineapple
    3  06284A3D     Banana
    >>> df2
              ID    Item
    0   TY671756  Carrot
    1   JG44454D  Banana
    2   07753DDD  Orange
    3   0628456D   Apple
    

    我有一个forloop,它将比较两个数据帧之间的Item列,并得到最接近的数据帧。例如:我从“df2”中提取苹果,并将其与df1中的“Item”列进行比较。我找到apple并将其作为匹配项更新到df2中的一个新列。现在我想在“df1”中找到匹配项的苹果的“ID”,在本例中是苹果。我想把df1中apple的ID更新到df2中的一个新列中。

    我能在同一个forloop中也这样做吗?因此,我得到了一个更新的df2,其中包含在df1中找到的匹配项及其ID号。

    list1 = df2['Item']
    list2 = df1['Item']
    
    for i in list1:
       df2['Item'] = [difflib.get_close_matches(i, list2)]
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   jezrael    6 年前

    我认为需要通过字典查找-输出是列表,因为一个或多个值是匹配的:

    list1 = df2['Item']
    list2 = df1['Item']
    
    d = df1.set_index('Item')['ID']
    df2['new'] = [[d[x] for x in difflib.get_close_matches(i, list2)] for i in list1]
    print (df2)
             ID    Item         new
    0  TY671756  Carrot          []
    1  JG44454D  Banana  [06284A3D]
    2  07753DDD  Orange  [0644304D]
    3  0628456D   Apple  [0667170D]
    

    编辑:对于输出,两列都使用 loop 解决方案:

    list1 = df2['Item']
    list2 = df1['Item']
    d = df1.set_index('Item')['ID']
    
    id2, item2 = [], []
    for i in list1:
         out =  difflib.get_close_matches(i, list2)
         id2.append([d[x] for x in out])
         item2.append(out)
    
    df2['id2new'] = id2    
    df2['item2new'] = item2
    print (df2)
             ID    Item      id2new  item2new
    0  TY671756  Carrot          []        []
    1  JG44454D  Banana  [06284A3D]  [Banana]
    2  07753DDD  Orange  [0644304D]  [Orange]
    3  0628456D   Apple  [0667170D]   [Apple]
    
        2
  •  2
  •   Sruthi    6 年前

    Merge 列上的两个dfs Item

    df3=df1.merge(df2,on="Item")
    

    这将为您提供两个数据帧中的匹配项及其ID

       ID_x    Item      ID_y
    0  0667170D   Apple  0628456D
    1  0644304D  Orange  07753DDD
    2  06284A3D  Banana  JG44454D
    

    如果您还想保留不匹配的项目:

    df1.merge(df2,on="Item",how="outer")
    
           ID_x       Item      ID_y
    0  0667170D      Apple  0628456D
    1  0644304D     Orange  07753DDD
    2  0655323D  Pineapple       NaN
    3  06284A3D     Banana  JG44454D
    4       NaN     Carrot  TY671756
    

    如果需要,可以重命名列。

        3
  •  0
  •   Adrish    6 年前

    如果你想执行这个使用for循环下面的代码可以使用我想。否则你可以使用@sruthiv的答案。

    newColumn = []
    for value in df2['Item'].values:
        if (len(df1[df1['Item']==value].values) > 0):
            newColumn.append(df1[df1['Item']==value].iloc[0,0])
        else:
            newColumn.append(np.NaN)
    
    df2['NewColumn'] = newColumn
    
    
    >>> df2
    
             ID    Item NewColumn
    0  TY671756  Carrot       NaN
    1  JG44454D  Banana  06284A3D
    2  07753DDD  Orange  0644304D
    3  0628456D   Apple  0667170D