从另一个数据帧的w.r.t列的数据框中删除元素

时间:2017-07-08 13:17:09

标签: python pandas

我有一个数据框说df1和MULTILEVEL INDEX:

       A     B     C      D
 0  0    0     1     2      3
         4     5     6      7
 1  2    8     9     10     11
    3    2     3     4      5

我还有另一个数据框,其中包含df2中的两个公共列,也有MULTILEVEL INDEX

          X     B     C      Y
 0   0    0     0     7      3
     1    4     5     6      7
 1   2    8     2     3     11
     3    2     3     4      5

我需要从df1中移除行BC的值与df2中的值相同的行,所以我应该得到类似这样的内容:

       A     B     C      D
  0  0    0     1     2      3
  0  2    8     9     10     11

我试图通过获取公共元素的索引然后通过列表删除它们来做到这一点,但它们都搞砸了,并且是多层次的。

2 个答案:

答案 0 :(得分:1)

您可以使用pandas.dataframe.ilocnumpy.wherenumpy.logical_or这样的单行内容执行此操作:(我觉得这是最简单的方法)

df1 = df1.iloc[np.where(np.logical_or(df1['B']!=df2['B'],df1['C']!=df2['C']))]

当然不要忘记:

import numpy as np

输出:

     A  B   C   D
0 0  0  1   2   3
1 2  8  9  10  11

希望这有用。如果有任何问题或意见,请随时发表评论。

答案 1 :(得分:0)

您可以从BC列中创建MultiIndex,然后调用索引的isin方法:

idx1 = pd.MultiIndex.from_arrays([df1['B'],df1['C']])
idx2 = pd.MultiIndex.from_arrays([df2['B'],df2['C']])
mask = idx1.isin(idx2)
result = df1.loc[~mask]

例如,

import pandas as pd
df1 = pd.DataFrame({'A': [0, 4, 8, 2], 'B': [1, 5, 9, 3], 'C': [2, 6, 10, 4], 'D': [3, 7, 11, 5], 'P': [0, 0, 1, 1], 'Q': [0, 0, 2, 3]})
df1 = df1.set_index(list('PQ'))
df1.index.names = [None,None]


df2 = pd.DataFrame({'B': [0, 5, 2, 3], 'C': [7, 6, 3, 4], 'P': [0, 0, 1, 1], 'Q': [0, 1, 2, 3], 'X': [0, 4, 8, 2], 'Y': [3, 7, 11, 5]})
df2 = df2.set_index(list('PQ'))
df2.index.names = [None,None]

idx1 = pd.MultiIndex.from_arrays([df1['B'],df1['C']])
idx2 = pd.MultiIndex.from_arrays([df2['B'],df2['C']])
mask = idx1.isin(idx2)
result = df1.loc[~mask]
print(result)

产量

     A  B   C   D
0 0  0  1   2   3
1 2  8  9  10  11