В настоящее время я пытаюсь отсортировать фрейм данных с 9 столбцами, но только по значениям в пределах 3 столбцов, и это оказалось сложнее, чем я думал.
В основном я пытаюсь пометить:
- 1) Если три столбца совпадают по всем трем столбцам, пометьте как "Полное соответствие"
- 2) Если они совпадают по двум столбцам, но последний имеет другую метку значения как «Конфликтующее значение» или «Частичное совпадение», если значение равно NA
- 3) Если есть только одно значение, а остальные являются знаком NA как «Уникальный»
- 4) Если все три столбца имеют NA, пометьте как «Пустой»
Первоначально, до того как я столкнулся с этой проблемой, я использовал df = df.sort_values(by = ['Cage_name_match_eid', 'Facility_match_eid', 'Clean_name_match_eid'], ascending = False)
Тем не менее, это не обеспечило никакой корреляции, по которой они совпадают в другом столбце. Моя следующая попытка использовала df[df.duplicated(['Cage_name_match_eid', 'Facility_match_eid', 'Clean_name_match_eid'], keep=False)]
, это удалило все уникальные значения, в которых я все еще нуждаюсь.
Наконец, я написал самую неопытную c, не элегантную функцию для сортировки на основе значений истинности. Он работает в некоторой степени, однако он помечает уникальные значения как конфликтующие, я решил спросить здесь, прежде чем писать алгоритм сортировки, который учителя CS будут использовать в качестве примера того, что NOT делать при сортировке ,
Вот функция:
def dupe_finder(row):
if ((row['Cage_name_match_eid']) and (row['Facility_match_eid']) and (row['Clean_name_match_eid'])) is not None:
if (row['Cage_name_match_eid'] == row['Facility_match_eid']) and \
(row['Facility_match_eid'] == row['Clean_name_match_eid']) and \
(row['Cage_name_match_eid'] == row['Clean_name_match_eid']):
val = 'Full Match'
return val
elif (row['Cage_name_match_eid'] == row['Facility_match_eid']) or \
(row['Facility_match_eid'] == row['Clean_name_match_eid']) or \
(row['Cage_name_match_eid'] == row['Clean_name_match_eid']):
val = 'Partial Match'
return val
elif (row['Cage_name_match_eid'] != row['Facility_match_eid']) or \
(row['Facility_match_eid'] != row['Clean_name_match_eid']) or \
(row['Cage_name_match_eid'] != row['Clean_name_match_eid']):
val = 'Conflicting Values'
return val
elif (row['Cage_name_match_eid'] != row['Facility_match_eid']) and \
(row['Facility_match_eid'] != row['Clean_name_match_eid']) and \
(row['Cage_name_match_eid'] != row['Clean_name_match_eid']):
val = 'Unique'
return val
else:
val = 'Empty'
return val
df['Dupes'] = left_over.apply(dupe_finder, axis = 1)
А вот некоторые примеры данных:
Cage_name_match_eid Facility_match_eid Clean_name_match_eid Dupes
122 RrDyv0 RrDyv0 RrDyv0 Full Match
529 JKvKeF JKvKeF JKvKeF Full Match
133 NaN JR_enw JR_enw Partial Match
297 NaN CfODTf CfODTf Partial Match
465 NaN KeJuQu KeJuQu Partial Match
20 NaN J8dWGK J8dWGK Partial Match
626 NaN Et8z8K Et8z8K Partial Match
448 NaN Q2mmII Q2mmII Partial Match
226 NaN Fi1goI Fi1goI Partial Match
93 GqSMp qGMsp qGMsp Conflicting Match
60 Jua2hK Jb7fQF Jb7fQF Conflicting Match
558 NaN KE_nxZ KE_nxZ Partial Match
300 NaN Ohqbid Ohqbid Partial Match
84 NaN KfcqtH KfcqtH Partial Match
461 NaN NaN NaN Empty