найти значение определенного столбца в dataframe2, используя значение одного столбца в dataframe1 в пандах - PullRequest
0 голосов
/ 13 сентября 2018

Я сделал поиск в Интернете. Я не нашел точный случай, который ищу. Мне нужна помощь. У меня есть два кадра данных с одним из столбцов, содержащих похожие элементы.

>>> 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' и сравниваю его со столбцом 'Item' в df1. Я нахожу яблоко и обновляю его до нового столбца в df2 как соответствующий элемент. Теперь я хотел бы найти «идентификатор» яблока в «df1» также для соответствующего элемента, в данном случае яблока. Я хотел бы обновить 'идентификатор' яблока в df1 в новый столбец в df2.

Смогу ли я сделать это в том же цикле? Так что я получаю обновленный df2 с обоими найденными в df1 элементами и идентификатором.

list1 = df2['Item']
list2 = df1['Item']

for i in list1:
   df2['Item'] = [difflib.get_close_matches(i, list2)]

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Я думаю, что нужен поиск по словарю - выходные данные являются списками, потому что одно или несколько значений совпадают:

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]
0 голосов
/ 13 сентября 2018

Если вы хотите выполнить это с помощью цикла 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
0 голосов
/ 13 сентября 2018

Объединить оба dfs в столбце Item

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

Это даст вам сопоставленные элементы и их идентификаторы с обоих кадров данных

   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

При необходимости вы можете переименовать столбцы.

...