【发布时间】:2022-08-17 02:30:55
【问题描述】:
我提出了这个新问题,因为我不确定用户的请求和措辞是否匹配:pandas left join where right is null on multiple columns
这个 SQL 的等效 pandas 代码是什么?在上下文中,我们正在从 table_y 中的列中查找相对于几列不在 table_x 中的条目。
SELECT
table_x.column,
table_x.column2,
table_x.column3,
table_y.column,
table_y.column2,
table_y.column3,
FROM table_x
LEFT JOIN table_y
ON table_x.column = table_y.column
ON table_x.column2 = table_y.column2
WHERE
table_y.column2 is NULL
是这个吗?
columns_join = [\'column\', \'column2\']
data_y = data_y.set_index(columns_join)
data_x = data_x.set_index(columns_join)
data_diff = pandas.concat([data_x, data_y]).drop_duplicates(keep=False) # any row not in both
# Select the diff representative from each dataset - in case datasets are too large
x1 = data_x[data_x.index.isin(data_diff.index)]
x2 = data_y[data_y.index.isin(data_diff.index)]
# Perform an outer join with the joined indices from each set,
# then remove the entries only contributed from table_x
data_compare = x1.merge(x2, how = \'outer\', indicator=True, left_index=True, right_index=True)
data_compare_final = (
data_compare
.query(\'_merge == left_join\')
.drop(\'_merge\', axis=1)
)
我不认为这是等效的,因为我们仅从 table_x 中删除了不在基于多列的连接中的条目。我认为我们必须继续将该列与 table_y 进行比较。
data_compare = data_compare.reset_index().set_index(\'column2\')
data_y = data_y.reset_index().set_index(\'column2\')
mask_column2 = data_y.index.isin(data_compare.index)
result = data_y[~mask_column2]
-
请提供具有预期输出的示例数据框
-
这有一些奇怪的边缘情况。今天下午晚些时候我可以回答我自己的问题。