假设我具有以下数据框:
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
我想根据条件删除重复的行:如果交换它们的单元格位置后的列name
和matched
的值相同,并且ratio
也相同,则将这些行视为重复的行
根据上述规则,row 0
和row 1
是重复项,因此我将仅保留row 0
。我该如何使用熊猫?谢谢。
这是预期的结果:
name matched ratio
0 john mary 78
1 peter jeff 22
2 jeff lisa 19
3 bill jose 45
答案 0 :(得分:3)
使用np.sort
对每行的值进行排序,添加列ratio
并按DataFrame.duplicated
测试重复项,最后按~
和boolean indexing
按反掩码过滤:
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
答案 1 :(得分:2)
请尝试以下操作:
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