Несоответствие рядов (Найдите значение в «несоответствии» рядов)

#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