Pandas从一个数据框中删除所有元素

时间:2014-04-10 18:34:34

标签: python pandas

我想基于列的子集找到两个数据帧(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,但这只适用于单列。

3 个答案:

答案 0 :(得分:2)

使用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 :(得分:1)

我知道这是一个非常古老的问题。但是,如果我搜索这个问题,这在谷歌上排在首位。如果数据框中的列都是值唯一的,则可以像这样完成

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

现在,第三个数据帧的值将是df1中的,而不是df2

答案 2 :(得分:0)

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

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