У меня есть два фрейма данных df1 (запись 35k) и df2 (запись 100k). В df1['col1'] и df2['col3'] у меня есть уникальные идентификаторы. Я хочу сопоставить df1['col1'] с df2['col3']. Если они совпадают, я хочу обновить df1 еще одним столбцом, скажем, df1['Match'] со значением true, а если не совпадают, обновить со значением False. Я хочу сопоставить это значение TRUE и False только с совпадающими и несовпадающими записями.
Я использую функцию .isin(), я получаю правильное совпадение и количество совпадений, но не могу правильно их сопоставить.
Match = df1['col1'].isin(df2['col3'])
df1['match'] = Match
Я также использовал функцию слияния, передав параметр how=right, но не получил результатов.
@kentwait После выполнения df1['match'] = Match, если у меня есть совпадения 10 записей. то в df1 он просто обновляется последовательно, но не до точной записи, которой он соответствует.
Количество строк, возвращаемых df1['col1'].isin(df2['col3']), равно количеству строк df1, независимо от того, сколько найденных совпадающих «истинных» записей. Вы можете попробовать ответить @crazyGamer, но ваш код должен работать нормально. Может быть, что-то еще не так.






Используйте индексацию df.loc:
df1['Match'] = False
df1.loc[df1['col1'].isin(df2['col3']), 'Match'] = True
@crazyGamer- спасибо, это работает для меня .. Могу ли я также сопоставить значение df2['col3'] для случаев True?
Да, вы можете повторить этот шаблон для df2 и col3. Как это работает: первая строка создает новый столбец и устанавливает для всех значений значение False. Вторая строка индексирует строки, используя логический ряд, и устанавливает для этих строк значение True.
Вы можете просто сделать следующее:
df1['Match'] = df1['col1'].isin(df2['col3'])
Например:
import pandas as pd
data1 = [1,2,3,4,5]
data2 = [2,3,5]
df1 = pd.DataFrame(data1, columns=['a'])
df2 = pd.DataFrame(data2,columns=['c'])
print (df1)
print (df2)
df1['Match'] = df1['a'].isin(df2['c']) # if matches it returns True else False
print (df1)
Вывод:
a
0 1
1 2
2 3
3 4
4 5
c
0 2
1 3
2 5
a Match
0 1 False
1 2 True
2 3 True
3 4 False
4 5 True
Это то же самое, что и OP без промежуточной переменной. Должно быть что-то еще, с чем сталкивается ОП.
@Ranjith - это тоже не работает ... как в вашем примере, все значения отсортированы, если они не отсортированы, они не будут работать ... код, которым вы делитесь, - это то, что я уже делаю. пожалуйста, проверьте мой код
Что вы имеете в виду под неправильным отображением? Используя ваш синтаксис,
df1['match'] = df1['col1'].isin(df2['col3']), кажется, работает для вашей описанной цели. Строкиdf1, значениеcol1которых найдено вdf2['col3'], будут иметь значение True, в противном случае — False.