【问题标题】:Find the difference (set difference) between two dataframes in python在python中查找两个数据帧之间的差异(设置差异)
【发布时间】:2019-06-19 16:13:02
【问题描述】:

我有两个数据框:df1 和 df2。 我想消除 df1 中所有出现的 df2 行。 基本上,这是设置差异运算符,但适用于数据帧。

我的问题与this question 非常相似,但有一个主要变化是 df1 可能根本没有公共行。在这种情况下,如果我们连接两个数据帧然后删除重复项,它仍然不能消除 df1 中出现的 df2。事实上,它增加了它。

这个问题也和this类似,只是我想对行进行操作。

例子:

Case 1:
df1:
A,B,C,D
E,F,G,H

df2:
E,F,G,H

Then, df1-df2:
A,B,C,D

Case 2:
df1:
A,B,C,D

df2:
E,F,G,H

Then, df1 - df2:
A,B,C,D

简单地说,我正在寻找一种方法来执行 df1 - df2(如果 df1 中存在 df2,则删除 df2)。这应该怎么做?

【问题讨论】:

  • @OP 你能确认这些是系列还是数据帧?如果它们是系列,那么 isin 将起作用。否则,它不会。
  • @coldspeed,OP 声明该操作需要对行进行,所以绝对是数据帧
  • 能否也确认一下逻辑是the set differencedf2: F,E,G,H 会导致相同的结果吗?

标签: python pandas dataframe


【解决方案1】:

设置 difference 将在这里工作,它返回 ar1 中不存在于 ar2 中的唯一值。

np.setdiff1d(df1, df2)

或者以DataFrame的形式得到结果,

pd.DataFrame([np.setdiff1d(df1, df2)])

【讨论】:

  • (回复:您在上面的评论)哦,好的。我只是感到困惑; setdiff1d 还会在行上工作吗?
  • @coldspeed,它按行工作,但集合没有排序,所以如果顺序很重要,就不会工作。
【解决方案2】:

尝试:

df1[~df1.isin(df2)]

A,B,C,D

【讨论】:

  • ^ 两行都返回,而不是'A,B,C,D'。你能检查一下吗?你的意见是什么?
  • @coldspeed 你是对的,如果索引如示例中给出的那样,合并更好。 :) 我考虑了相同的索引
  • 如果这些是系列,那么只使用 isin 是有意义的。但是 OP 提到他们有两个 DataFrame。所以我很好奇为什么这么多人误解了这个问题(甚至对我完全有效的答案投了反对票)。
猜你喜欢
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多