考虑数据框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
我想将df.A
的所有行与df.B
的所有行进行比较,并删除具有匹配项的行。我不想要删除在df.A
或df.B
内有数学的行。
视觉
[0, 1]
。[3, 4]
,因为'm', 'n'
匹配[5, 7]
,因为'q', 'r'
匹配结果应该是
df.loc[[0, 1, 2, 6]]
我已尝试 加入stack
和drop_duplicates
df.stack(0).drop_duplicates(keep=False) \
.unstack().dropna() \
.swaplevel(0, 1, 1).sort_index(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