Python 基于多个规则的重复数据消除
我想根据多个条件消除pandas中的重复行 我有3列:name、id和nick_name 第一条规则是寻找重复的id。当id匹配时,只要我至少保留一行,就只保留name和nick_name不同的行 换句话说,如果name和nick_name不匹配,则保留该行。如果name和nick_name匹配,那么去掉该行,只要它不是该id剩下的唯一一行 示例数据: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
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
很好,谢谢!