使用混合变量类型检测几乎重复的行

时间:2019-05-19 10:16:12

标签: python pandas duplicates

例如,我正在尝试根据姓名,年龄和国家/地区在此集中查找重复的值

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

我尝试使用此处提供的解决方案:Detecting almost duplicate rows

但是,我正在努力调整解决方案以接受非整数值。

我还尝试过创建一个包含年龄+/- 1的数组(例如:https://stackoverflow.com/a/43160595/10816095),希望使用该数组进行匹配,但我似乎无法将其附加到数据帧中。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

在所有3列中使用DataFrame.sort_values,列表中的最后一列是整数列,然后按具有相同值的列分组,将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