使用布尔索引根据匹配的列值删除重复项
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
如果需要等于 NaN
s 或 None
s 使用:
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_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
合并两个 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
如果需要等于 NaN
s 或 None
s 使用:
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_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