Pandas - 按ID分组并删除重复阈值

Man*_*men 5 python group-by duplicates threshold pandas

我有以下数据:

userid itemid
  1       1
  1       1
  1       3
  1       4
  2       1
  2       2
  2       3
Run Code Online (Sandbox Code Playgroud)

我想删除已查看相同itemID大于或等于两次的userID.例如,userid = 1已经两次查看itemid = 1,因此我想删除userid = 1的整个记录​​.但是,由于userid = 2没有两次查看同一项,我将保留userid = 2.

所以我希望我的数据如下:

userid itemid
  2       1
  2       2
  2       3
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗?

import pandas as pd    
df = pd.DataFrame({'userid':[1,1,1,1, 2,2,2],
                   'itemid':[1,1,3,4, 1,2,3] })
Run Code Online (Sandbox Code Playgroud)

roo*_*oot 7

您可以使用duplicated确定行级别重复项,然后执行groupbyon"userid"以确定"userid"级别重复项,然后相应地删除.

没有阈值的下降:

df = df[~df.duplicated(['userid', 'itemid']).groupby(df['userid']).transform('any')]
Run Code Online (Sandbox Code Playgroud)

要与阈值下降,可使用keep=Falseduplicated,总结在布尔列和比较反对您的门槛.例如,阈值为3:

df = df[~df.duplicated(['userid', 'itemid'], keep=False).groupby(df['userid']).transform('sum').ge(3)]
Run Code Online (Sandbox Code Playgroud)

结果输出无阈值:

   userid  itemid
4       2       1
5       2       2
6       2       3
Run Code Online (Sandbox Code Playgroud)


piR*_*red 6

filter

为此。您可以传递一个函数,该函数返回一个布尔值,该值确定组是否通过了过滤器。

filtervalue_counts
最通用和直观

df.groupby('userid').filter(lambda x: x.itemid.value_counts().max() < 2)
Run Code Online (Sandbox Code Playgroud)

filteris_unique
特殊情况下,当寻找n < 2

df.groupby('userid').filter(lambda x: x.itemid.is_unique)

   userid  itemid
4       2       1
5       2       2
6       2       3
Run Code Online (Sandbox Code Playgroud)