pandas删除相对于其他列的某些列中的重复行

时间:2016-08-29 17:57:38

标签: python pandas

考虑数据框df

data = [
    ['a', 'b', 'c', 'd'],
    ['a', 'b', 'e', 'f'],
    ['g', 'h', 'i', 'j'],
    ['k', 'l', 'm', 'n'],
    ['m', 'n', 'o', 'p'],
    ['q', 'r', 's', 't'],
    ['u', 'v', 'w', 'x'],
    ['y', 'z', 'q', 'r'],
]

cols = pd.MultiIndex.from_product([list('AB'), list('XY')])

df = pd.DataFrame(data, columns=cols)

df

enter image description here

我想将df.A的所有行与df.B的所有行进行比较,并删除具有匹配项的行。我想要删除在df.Adf.B内有数学的行。

视觉

enter image description here

  • 仅保留行[0, 1]
  • 删除行[3, 4],因为'm', 'n'匹配
  • 删除行[5, 7],因为'q', 'r'匹配

结果应该是

df.loc[[0, 1, 2, 6]]

enter image description here

我已尝试 加入stackdrop_duplicates

df.stack(0).drop_duplicates(keep=False) \
    .unstack().dropna() \
    .swaplevel(0, 1, 1).sort_index(1)

enter image description here

但是,它会在相同的子列中捕获重复项,这不是我想要的。

1 个答案:

答案 0 :(得分:3)

试试这个:

In [248]: df[~(df.A.isin(df.B.to_dict('list')).all(1) | df.B.isin(df.A.to_dict('list')).all(1))]
Out[248]:
   A     B
   X  Y  X  Y
0  a  b  c  d
1  a  b  e  f
2  g  h  i  j
6  u  v  w  x

说明:

In [249]: df.A.isin(df.B.to_dict('list'))
Out[249]:
       X      Y
0  False  False
1  False  False
2  False  False
3  False  False
4   True   True
5   True   True
6  False  False
7  False  False

In [250]: df.A.isin(df.B.to_dict('list')).all(1)
Out[250]:
0    False
1    False
2    False
3    False
4     True
5     True
6    False
7    False
dtype: bool

In [251]: df.B.isin(df.A.to_dict('list'))
Out[251]:
       X      Y
0  False  False
1  False  False
2  False  False
3   True   True
4  False  False
5  False  False
6  False  False
7   True   True

In [252]: df.B.isin(df.A.to_dict('list')).all(1)
Out[252]:
0    False
1    False
2    False
3     True
4    False
5    False
6    False
7     True
dtype: bool

结合两者:

In [253]: df.A.isin(df.B.to_dict('list')).all(1) | df.B.isin(df.A.to_dict('list')).all(1)
Out[253]:
0    False
1    False
2    False
3     True
4     True
5     True
6    False
7     True
dtype: bool