我想根据多个条件对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发布于 2021-02-19 07:55:05
我们可以把它分成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 Jameshttps://stackoverflow.com/questions/66269739
复制相似问题