Python 基于多个规则的重复数据消除

Python 基于多个规则的重复数据消除,python,pandas,Python,Pandas,我想根据多个条件消除pandas中的重复行 我有3列:name、id和nick_name 第一条规则是寻找重复的id。当id匹配时,只要我至少保留一行,就只保留name和nick_name不同的行 换句话说,如果name和nick_name不匹配,则保留该行。如果name和nick_name匹配,那么去掉该行,只要它不是该id剩下的唯一一行 示例数据: data = {"name": ["Sam", "Sam", "Josep

我想根据多个条件消除pandas中的重复行

我有3列:name、id和nick_name

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

换句话说,如果name和nick_name不匹配,则保留该行。如果name和nick_name匹配,那么去掉该行,只要它不是该id剩下的唯一一行

示例数据:

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
产生:

    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
根据以上规则,我希望生成的数据帧能够产生以下结果:

    name    id  nick_name
0   Sam     1   Sammie
3   Joseph  2   Joe
4   Joseph  2   Joey
5   Philip  3   Philip
7   James   4   James

我们可以将其拆分为3个布尔条件,以过滤初始数据帧

#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

很好,谢谢!