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)
您可以使用duplicated确定行级别重复项,然后执行groupbyon"userid"以确定"userid"级别重复项,然后相应地删除.
没有阈值的下降:
df = df[~df.duplicated(['userid', 'itemid']).groupby(df['userid']).transform('any')]
Run Code Online (Sandbox Code Playgroud)
要与阈值下降,可使用keep=False的duplicated,总结在布尔列和比较反对您的门槛.例如,阈值为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)
filter为此。您可以传递一个函数,该函数返回一个布尔值,该值确定组是否通过了过滤器。
filter和value_counts
最通用和直观
df.groupby('userid').filter(lambda x: x.itemid.value_counts().max() < 2)
Run Code Online (Sandbox Code Playgroud)
filter和is_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)
| 归档时间: |
|
| 查看次数: |
5590 次 |
| 最近记录: |