【问题标题】:Detecting almost duplicate rows with mixed variable types检测具有混合变量类型的几乎重复的行
【发布时间】:2019-05-19 10:16:12
【问题描述】:

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

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),希望使用它来匹配,但我似乎无法将其附加到数据框。

我该怎么做?

【问题讨论】:

    标签: python pandas duplicates


    【解决方案1】:

    所有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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2014-06-22
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      相关资源
      最近更新 更多