使用布尔索引根据匹配的列值删除重复项

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 None 658
x04 None 660
x05 658 660
x06 660 660

y table包含左连接变量的多个值(不包含在table中),导致每个唯一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 None 658
x05 658 660
x06 660 660

想法是比较两列是否不相等,然后按 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

如果需要等于 NaNs 或 Nones 使用:

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))

也许,您可以简单地使用:

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_duplicatesduplicated 但如果你想确保每个 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