#python #pandas #dataframe #find
Вопрос:
Чувствую, что я должен это знать. Я пытаюсь сравнить два кадра данных и найти тех людей, которые не включены:
Первый df
data_x = {'Num':[321654,654987, 654321], 'Name':['Tim', 'Jake', 'Sam']}
x = pd.DataFrame(data_x)
x =
0 321654 Tim
1 654987 Jake
2 654321 Sam
Второй df
data_z = {'Num':[321654,123456, 654987,894523], 'Name':['Tim', 'Jim', 'Jake', 'Bob']}
z = pd.DataFrame(data_z)
z =
0 321654 Tim
1 123456 Jim
2 654987 Jake
3 894523 Bob
Запрошенные результаты =
0 123456 Jim
1 894523 Bob
Комментарии:
1. Является
Jakez
ли второй df на самом делеJake
?2. лол, да, ошибка c/p. Исправлено
3. Нужны какие-либо дополнительные разъяснения ?
Ответ №1:
Вы можете выполнить внешнее .merge()
включение x
и z
с параметром indicator=True
и проверить , с какими результатами слияния right_only
, как показано ниже:
out = x.merge(z, how='outer', indicator=True)
# You can also specify the 2 columns if there are other columns in real situation
# out = x.merge(z, on=['Num', 'Name'] how='outer', indicator=True)
Результат:
print(out)
Num Name _merge
0 321654 Tim both
1 654987 Jake both
2 654321 Sam left_only
3 123456 Jim right_only
4 894523 Bob right_only
а затем отфильтруйте результат по:
out.loc[out['_merge'] == 'right_only']
Выход:
Num Name _merge
3 123456 Jim right_only
4 894523 Bob right_only
Конечно, вы можете удалить столбец результатов слияния и сбросить индекс, если хотите:
out_filtered = out.loc[out['_merge'] == 'right_only']
out_filtered = out_filtered.drop(columns='_merge').reset_index(drop=True)
print(out_filtered)
Num Name
0 123456 Jim
1 894523 Bob