提问人:Stijn 提问时间:3/29/2022 最后编辑:Stijn 更新时间:3/29/2022 访问量:234
使用布尔索引根据匹配的列值删除重复项
Removing duplicates based on matching column values with boolean indexing
问:
合并两个 DF 后,我有以下数据集:
DB_ID | x_val | y_val |
---|---|---|
x01系列 | 405 | 407 |
x01系列 | 405 | 405 |
x02系列 | 308 | 306 |
x02系列 | 308 | 308 |
x03系列 | 658 | 658 |
x03系列 | 658 | 660 |
x04系列 | 没有 | 658 |
x04系列 | 没有 | 660 |
x05系列 | 658 | 660 |
x06系列 | 660 | 660 |
y 表包含左联接变量的多个值(不包括在表中),导致每个唯一DB_ID(字符串变量,不在 df 索引中)多行。
问题在于只有一行是正确的,其中x_val和y_val匹配。我尝试使用以下代码删除重复项:df= df[~df['DB_ID'].duplicated() | combined['x_val'] != combined['y_val']]
然而,这是行不通的。我正在寻找一种解决方案来实现以下结果:
DB_ID | x_val | y_val |
---|---|---|
x01系列 | 405 | 405 |
x02系列 | 308 | 308 |
x03系列 | 658 | 658 |
x04系列 | 没有 | 658 |
x05系列 | 658 | 660 |
x06系列 | 660 | 660 |
答:
2赞
jezrael
3/29/2022
#1
想法是比较两列不相等,然后按以下方式对重复项进行排序和重新分配:DB_ID
df = (df.assign(new = df['x_val'].ne(df['y_val']))
.sort_values(['DB_ID','new'])
.drop_duplicates('DB_ID')
.drop('new', axis=1))
print (df)
DB_ID x_val y_val
1 x01 405 405
3 x02 308 308
4 x03 658 658
6 x04 None 658
8 x05 658 660
9 x06 660 660
如果需要相等的 s 或 s,请使用:NaN
None
df = (df.assign(new = df['x_val'].fillna('same').ne(df['y_val'].fillna('same')))
.sort_values(['DB_ID','new'])
.drop_duplicates('DB_ID')
.drop('new', axis=1))
评论
1赞
Stijn
3/29/2022
太棒了,谢谢!
0赞
Corralien
3/29/2022
#2
也许,您可以简单地使用:
df = df[df['x_val'] == df['y_val']]
print(df)
# Output
DB_ID x_val y_val
1 x01 405 405
3 x02 308 308
4 x03 658 658
我认为你不需要,但如果你想确保每个只有一个实例,你可以附加drop_duplicates
duplicated
DB_ID
.drop_duplicates('DB_ID')
df = df[df['x_val'] == df['y_val']].drop_duplicates('DB_ID')
print(df)
# Output
DB_ID x_val y_val
1 x01 405 405
3 x02 308 308
4 x03 658 658
评论
DB_ID
x04 100 100
x01 405 405
x01
x05 200 300