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

时间:2018-09-13 10:49:15

标签: python pandas dataframe string-comparison

我在网上做了一些搜索。我没有找到所需的确切案例。 我需要帮助。我有两个数据框,其中一列包含相似的项目。

>>> 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”列进行比较。我找到了苹果,并将其更新为df2中的新列作为匹配项。现在,我也想在'df1'中找到匹配项(在本例中为apple)的苹果的'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 个答案:

答案 0 :(得分:2)

MergeItem上的两个df

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

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

答案 1 :(得分:0)

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

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 :(得分:0)

如果您想使用for循环执行此操作,则可以使用以下代码。否则,您可以使用@Sruthi V的答案。

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