Как определить, что произошел обмена значениями в DataFrame
Я новичок в Python и тяжело дается эта задачка оптимальным путем. У меня есть база с КПП, в которой есть id сотрудника и номер его пропуска. У некоторых сотрудников есть много номеров пропуска- это странно, но примем этот как факт. Мне надо написать код, который бы определил, кто из сотрудников прошел по чужому пропуску, другими словами, между сотрудниками произошел обмен пропусками и это надо идентифицировать: От кого -> Кому-> Какой номер пропуска. id сотрудника определяется по камере на КПП. Чистый DataFrame, без обмена. Он чистый, тут нет никакого обмена. Выглядит так:
Тут датасет, в котором есть обмен между двумя сотрудниками (обмен показан стрелками):

Я сделал по "чистому" датасету словарь (номера пропусков через пробел), чтобы по нему сравнивать:
# Создание справочника сотрудника
def make_directory(df):
#df.rename(columns={' IMSI':'IMSI',' IMEISV':'IMEISV',' Наименование': 'Наименование',' Дата создания':'Дата создания' ,' Время изменения состояния': 'Время изменения состояния',' Время последнего взаимодействия':'Время последнего взаимодействия',' Имя зоны':'Имя зоны',' Имя устройства':'Имя устройства',' Компонент устройства':'Компонент устройства',' Состояние':'Состояние'}, inplace=True)
res = df.groupby("id сотрудника")["Номер пропуска"].apply(lambda x: ' '.join([str(i) for i in x])).to_frame()
return res
По итогу у меня код получается с тремя циклами for и очень длинный. Помогите решить эту задачу.
В результате, должно быть, что-то вроде этого:
Ответы (1 шт):
d1 = pd.read_csv("subset.csv", index_col=0).drop_duplicates()
d2 = pd.read_csv("anomaly_subset.csv", index_col=0).drop_duplicates()
d1.columns = d2.columns
res = d2.merge(d1, how="left", indicator=True).query("_merge == 'left_only'")
res = d1.merge(res, on="IMSI", suffixes=("_from", "_to")).drop(columns="_merge")
результат:
In [170]: res
Out[170]:
IMEISV_from IMSI IMEISV_to
0 3573320886721407 250011764226668 136250051790829
1 136250051790829 250011773707303 3573320886721407


