例如,我正在尝试根据姓名,年龄和国家/地区在此集中查找重复的值
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),希望使用该数组进行匹配,但我似乎无法将其附加到数据帧中。
我该怎么做?
答案 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