Python 在比较数据帧时标识唯一行

Python 在比较数据帧时标识唯一行,python,pandas,Python,Pandas,我有两个数据帧,具有相同的列,具有可能相交的行: df1 df2 A B A B m m 1 2 1 2 3 4 3 4 5 6 5 6 x x n n y y 我需要确定哪些行在df1中,而不是df2中,反之亦然。解决方案数据帧可能如下所示: indf1_notindf2 A B m m n n indf2_notindf1 A B x x y y 或者只是一个数据帧,如下所示: A B FLAG m m only_df1 n n o

我有两个数据帧,具有相同的列,具有可能相交的行:

df1    df2


A B    A B

m m    1 2
1 2    3 4
3 4    5 6
5 6    x x
n n    y y
我需要确定哪些行在df1中,而不是df2中,反之亦然。解决方案数据帧可能如下所示:

indf1_notindf2

A B
m m
n n

indf2_notindf1

A B
x x
y y

或者只是一个数据帧,如下所示:

A B FLAG
m m only_df1
n n only_df1
x x only_df2
y y only_df2

或者其他解决方法

我曾尝试连接两个数据帧并删除重复的数据帧,但我不知道这些行来自哪个数据帧。感谢您的帮助。注意:两个数据帧的实际大小大约为500k行。

执行以下操作:

df1['FLAG'] = 'only_df1'
df2['FLAG'] = 'only_df2'

df = df1.append(df2).drop_duplicates(['A','B'], keep=False)
执行以下操作:

df1['FLAG'] = 'only_df1'
df2['FLAG'] = 'only_df2'

df = df1.append(df2).drop_duplicates(['A','B'], keep=False)

这里有一种方法可以使用:


这里有一种方法可以使用:

这是由于
指示器=True
+:


然后,您可以使用字典将
仅左
重新映射到
df1
,并根据方便程度将
仅右
重新映射到

这是使用
指示器=真
+:


然后,您可以使用字典将
仅左
重新映射到
df1
,并根据需要将
仅右
重新映射到

m = df1.merge(df2,on=[*df1],how='outer',indicator=True).query("_merge!='both'")
print(m)
   A  B      _merge
0  m  m   left_only
4  n  n   left_only
5  x  x  right_only
6  y  y  right_only