在 Pandas 中设置两个数据帧的差异

Set difference of two dataframes in Pandas

希望有人能帮忙解答这个问题。以前也问过类似的问题,但是他们的答案都不完全正确,即使是选的也一样。

我想得到两个 Pandas 数据帧的集合差异。意思是,df1 - df2 等于存在于 df1 但不存在于 df2 中的行。 df1 中但不在 df2 中的任何行都必须在结果中。共同的行不得出现在结果中。经典集差定义。

此外,必须忽略索引。这意味着两行的相等性必须通过以下方式确定:

1) 它们是否具有相同的列名(如果它们包含的数据框具有相同的列名,则满足)并且,

2) 如果 1 为真,每列的值是否完全相同(字符串匹配 - 好的,我们也可以考虑不区分大小写)

其他问题中的例子是简化的例子,虽然它们可能在有限的范围内起作用,但并不适用于所有情况。请尝试考虑列中的值可能不是简单数据类型,而是列表或元组本身的情况。或者,如果后来有人定义了自定义类型及其 equals 方法,该解决方案也适用于这些类型。

您可以尝试散列行然后检查

例如

df1['match'] = df.apply(lambda x: hash(tuple(x)), axis=1)
df2['match'] = df2.apply(lambda x: hash(tuple(x)), axis=1)
df_diff = df1[~df1['match'].isin(df2['match'])]