如果在Pandas中交换后,列的值相同,则删除重复项

3

假设我有以下DataFrame:

df = pd.DataFrame({'name':['john','mary','peter','jeff','bill'], 'matched_name':['mary','john','jeff','lisa','jose'], 'ratio':[78, 78, 22, 19, 45]})
print(df)
    name   matched_name  ratio
0   john      mary        78
1   mary      john        78
2  peter      jeff        22
3   jeff      lisa        19
4   bill      jose        45

我想根据以下条件删除重复的行:如果在交换它们的单元格位置后,列namematched具有相同的值且ratio也相同,则这些行被视为重复行。

根据上述规则, row 0 row 1 是重复的,因此我只保留 row 0 。 我如何使用Pandas实现呢?谢谢。

这是预期结果:

    name matched  ratio
0   john    mary     78
1  peter    jeff     22
2   jeff    lisa     19
3   bill    jose     45
2个回答

3

使用np.sort对每行的值进行排序,添加列ratio并通过DataFrame.duplicated测试重复项,并通过布尔索引的反向掩码进行过滤:

m = (pd.DataFrame(np.sort(df[['name', 'matched_name']], axis=1), index=df.index)
       .assign(ratio=df['ratio'])
       .duplicated())

df = df[~m]
print (df)
    name matched_name  ratio
0   john         mary     78
2  peter         jeff     22
3   jeff         lisa     19
4   bill         jose     45

2

Try the below:

m=pd.DataFrame(np.sort(df.astype(str).values,axis=1)).drop_duplicates().index
df=df.loc[df.index.isin(m)].reset_index()
print(df)

   index   name matched_name  ratio
0      0   john         mary     78
1      2  peter         jeff     22
2      3   jeff         lisa     19
3      4   bill         jose     45

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接