Проверьте, существует ли значение строки в кадре данных в другом кадре данных, используя l oop для согласования - PullRequest
0 голосов
/ 28 мая 2020

Я хочу разработать некоторые общие c logi c, которые позволят мне выполнять согласование между 2 наборами данных.

У меня есть 2 кадра данных, и я хочу l oop через каждое значение строки в df1 и проверьте, существует ли он в df2. Если он существует, я хочу создать новый столбец «Соответствие» в df1 со значением «Да», и если он не существует, я хочу добавить недостающие значения в отдельный df, который я напечатаю в csv.

Примеры наборов данных:

df1:

ID   Name     Age
1    Adam     45  
2    Bill     44   
3    Claire   23  

df2:

ID   Name     Age
1    Adam     45 
2    Bill     44 
3    Claire   23
4    Bob      40
5    Chris    21

Имена столбцов в двух фреймах данных, которые я использовал здесь, приведены только для справки. Но по сути я хочу проверить, существует ли строка (1, Adam, 45) в df1 в df2.

Результат для df3 будет выглядеть так: df3:

ID   Name     Age
4    Bob      40  
5    Chris    21 

Обновленный df1 будет выглядеть так: df2:

ID   Name     Age  Match
1    Adam     45    Yes  
2    Bill     44    Yes  
3    Claire   23    Yes 

Для ясности, я понимаю, что это можно сделать с помощью слияния или isin, но мне хотелось бы гибкое решение, которое можно было бы использовать для любого набора данных.

Я понимаю, что это может быть большой вопрос, так как я не предоставил много рекомендаций, но любая помощь с этим была бы замечательной !!

Спасибо !!

1 Ответ

0 голосов
/ 28 мая 2020

Здесь необходимо использовать merge и использовать функцию indicator=True:

df_all = df1.merge(df2, on=['ID'], how='outer', indicator=True)
df3 = df_all[df_all['_merge'] == 'right_only'].drop(columns=['Name_x', 'Age_x']).rename(columns={'Name_y': 'Name', 'Age_y': 'Age'})[['ID', 'Name', 'Age']]
df2 = df_all[df_all['_merge'] == 'both'].drop(columns=['Name_x', 'Age_x']).rename(columns={'Name_y': 'Name', 'Age_y': 'Age'})[['ID', 'Name', 'Age']]
print(df3)
print(df2)

df3:

   ID   Name  Age
3   4    Bob   40
4   5  Chris   21

df2:

   ID    Name  Age
0   1    Adam   45
1   2    Bill   44
2   3  Claire   23
...