【问题标题】:Pandas remove all elements from one dataframe from anotherPandas 从一个数据帧中删除另一个数据帧中的所有元素
【发布时间】:2014-04-10 18:34:33
【问题描述】:

我想根据列的子集找出两个数据框(df1 中的元素,而不是 df2 中的元素)之间的差异。这两个数据框具有相同的架构。

说 df1 包含

col1 col2 col3 col4
A    B    C    D
A    C    D    D

而 df2 包含

col1 col2 col3 col4
A    D    D    D
A    B    D    D

我想要 df1 中的项目,其中 df2 中没有 col1 和 col2 匹配的项目。所以在这种情况下,预期的输出将只是 df1 的第二行。

A    C    D    D

我尝试了isin 的不同变体,但我很难找到任何可行的方法。我试过 https://stackoverflow.com/a/16704977/1639228 ,但这只适用于单列。

【问题讨论】:

  • 为什么说“基于 col1 和 col2”?你的预期输出看起来更像df1的第二行
  • 预期输出是df1的第二行。我的意思是我想要 df1 中的项目,而不是 df2,只查看列 col1 和 col2。

标签: python pandas


【解决方案1】:

使用isin 的问题是,如果使用DataFrame,索引也必须匹配。我不知道你的索引是什么,但是如果 col1 和 col2 相等的地方不同,它仍然会返回否定结果。

将您的第二个 DataFrame 转换为列表将使其工作(因为这会删除索引)。 isin 分别匹配两列,但使用 all(axis-1) 您可以将其过滤到两者都匹配的情况。

sub = ['col1', 'col2']
mask = df1[sub].isin(df2[sub].to_dict(outtype='list')).all(axis=1)

df1[~mask]

  col1 col2 col3 col4
1    A    C    D    D

【讨论】:

  • 感谢您的回复,+1。我发布了我想出的解决方案。你知道这两种方法是否更有效吗?我不熟悉熊猫在幕后实际上在做什么。
【解决方案2】:

我知道这是一个非常古老的问题。但如果我搜索这个问题,这在谷歌上是最重要的。如果两个数据框中都有一个列的值是唯一的,则可以这样做

  uniq__value_list = df1[col1].tolist()
  df3 = df2[~df.col1.isin(uniq__value_list)]

现在,第三个数据帧将具有 在 df1 中但不在 df2 中的值

【讨论】:

    【解决方案3】:

    我不知道这是否有效,但经过数小时的试验,我找到了一种方法。它涉及首先重新索引数据帧以使用您关心的列作为索引。

    df1.set_index(['col1', 'col2'], inplace=True)
    df2.set_index(['col1', 'col2'], inplace=True)
    
    df1[df1.index.map(lambda x: x not in df2.index)]
    

    【讨论】:

      猜你喜欢
      • 2017-11-16
      • 2021-08-28
      • 1970-01-01
      • 2016-11-17
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2018-03-09
      相关资源
      最近更新 更多