Обнаружение почти одинаковых строк со смешанными типами переменных - PullRequest
1 голос
/ 19 мая 2019

Скажем, например, я пытаюсь найти повторяющиеся значения в этом наборе, основываясь на имени, возрасте и стране

NAME AGE COUNTRY PROFESSION
'Fred' 23 America Banker
'Paula' 78 Germany Retired
'Fred' 23 America Banker
'Fred' 22 America Student
'Fred' 23 Brazil Police Officer
'Bingo' 36 New Zealand Money

Чтобы найти точные дубликаты, которые я использовал:

dupDF = df[df.duplicated(['NAME', 'AGE', 'COUNTRY'], keep=False)]

Что дало бы мне:

NAME AGE COUNTRY PROFESSION
'Fred' 23 America Banker
'Fred' 23 America Banker

Что я действительно хочу, так это сопоставить по Имени, Возрасту (+/- 1) и Стране, чтобы получить:

NAME AGE COUNTRY PROFESSION
'Fred' 23 America Banker
'Fred' 23 America Banker
'Fred' 22 America Student

Я пытался использовать представленные здесь решения: Обнаружение почти дублированных строк

Однако я изо всех сил пытаюсь адаптировать решение для принятия нецелых значений.

Я также пытался создать массив (как в: https://stackoverflow.com/a/43160595/10816095), который содержит Age +/- 1, в надежде использовать его для соответствия, но я не могу добавить его к кадру данных.

Как я могу это сделать?

1 Ответ

0 голосов
/ 19 мая 2019

Используйте DataFrame.sort_values по всем 3 столбцам, последний столбец в списке - это целочисленный столбец, затем группировка по столбцам с одинаковыми значениями и Series.diff со значением обратного заполнения фортов, последнийсравнить на Series.lt для <, отсортировать индекс по Series.sort_index и перейти к boolean indexing:

mask = (df.sort_values(['NAME','COUNTRY','AGE'])
          .groupby(['NAME','COUNTRY'])['AGE'].apply(lambda x: x.diff().bfill())
          .lt(2)
          .sort_index())

df = df[mask]
print (df)
     NAME  AGE  COUNTRY PROFESSION
0  'Fred'   23  America     Banker
2  'Fred'   23  America     Banker
3  'Fred'   22  America    Student
...