【问题标题】:Set difference of two dataframes in Pandas [duplicate]在 Pandas 中设置两个数据帧的差异 [重复]
【发布时间】:2018-09-07 19:32:06
【问题描述】:

我希望有人可以帮助回答这个问题。以前也有人问过类似的问题,但他们的答案并不完全正确,即使是选定的。

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

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

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

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

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

【问题讨论】:

  • 您是否考虑与我们分享您要比较的dfs示例?
  • 可能有一些连接,可能使用覆盖所有列的复合键。请显示示例数据,以使其成为 MCVE。只是一些小而有代表性的东西。另外 1) 有点无关紧要, df1 中的所有行都将具有相同的列。而且您的要求“必须忽略索引”可能是个坏主意,我们可能需要一个复合行索引,以便我们可以检测到相等性。 “其他问题中的示例......并不适用于所有情况。”这太笼统了,您没有提供任何 MCVE。我们真的应该对所有字符串列进行不区分大小写的匹配吗?比较不同的编码?

标签: python pandas dataframe set-difference


【解决方案1】:

您可以尝试对行进行哈希处理,然后检查

例如

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

【讨论】:

    猜你喜欢
    • 2019-06-19
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多