首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas中基于多规则的重复数据删除

Pandas中基于多规则的重复数据删除
EN

Stack Overflow用户
提问于 2021-02-19 07:38:00
回答 1查看 27关注 0票数 2

我想根据多个条件对pandas中的行进行去重。

我有3列: name、id和nick_name。

第一条规则是寻找重复的id,当id匹配时,只要我至少保留一行,就只保留name和nick_name不同的行。

换句话说,如果name和nick_name不匹配,则保留该行。如果name和nick_name匹配,则删除该行,只要该行不是为该id留下的唯一行。

示例数据:

代码语言:javascript
复制
data = {"name": ["Sam", "Sam", "Joseph", "Joseph", "Joseph", "Philip", "Philip", "James"],
        "id": [1,1,2,2,2,3,3,4],
        "nick_name": ["Sammie", "Sam", "Joseph", "Joe", "Joey", "Philip", "Philip", "James"]}
df = pd.DataFrame(data)
df

产生:

代码语言:javascript
复制
    name    id  nick_name
0   Sam     1   Sammie
1   Sam     1   Sam
2   Joseph  2   Joseph
3   Joseph  2   Joe
4   Joseph  2   Joey
5   Philip  3   Philip
6   Philip  3   Philip
7   James   4   James

根据我上面的规则,我想要一个结果数据帧生成以下内容:

代码语言:javascript
复制
    name    id  nick_name
0   Sam     1   Sammie
3   Joseph  2   Joe
4   Joseph  2   Joey
5   Philip  3   Philip
7   James   4   James
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-19 07:55:05

我们可以把它分成3个布尔条件来过滤你的初始数据帧。

代码语言:javascript
复制
#where name and nick_name match, keep the first value.

con1 = df.duplicated(subset=['name','nick_name'],keep='first')

# where ids are duplicated and name is not equal to nick_name

con2 = df.duplicated(subset=['id'],keep=False) & df['name'].ne(df['nick_name'])

# where no duplicate exists. 

con3 = df.groupby('id')['id'].transform('size').eq(1)

print(df.loc[con1 | con2 | con3])


 name  id nick_name
0     Sam   1    Sammie
3  Joseph   2       Joe
4  Joseph   2      Joey
6  Philip   3    Philip
7   James   4     James
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66269739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档