在 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'])]
希望有人能帮忙解答这个问题。以前也问过类似的问题,但是他们的答案都不完全正确,即使是选的也一样。
我想得到两个 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'])]