python中不同级别的反连接数据帧

python中不同级别的反连接数据帧,python,pandas,anti-join,Python,Pandas,Anti Join,我有两个熊猫数据帧,分别是df1和df2。 df1有6个变量,df2有5个变量。 两个数据帧中的第一个变量都是字符串格式,铰孔是int格式 我想通过使用前3个参数来识别两个数据帧中不匹配的记录 两个数据帧的列,并且必须将它们从df1数据帧中排除 为此,我尝试了以下代码,但如果我删除 然后,所需数据将被删除 输入数据:- 预期输出:- 语法:- 请任何人都能帮我解决这个问题 提前感谢。首先与left join一起使用,从df2中获取添加列的列名,并按它们过滤掉所有非NaNs行: df = df1.

我有两个熊猫数据帧,分别是df1和df2。 df1有6个变量,df2有5个变量。 两个数据帧中的第一个变量都是字符串格式,铰孔是int格式

我想通过使用前3个参数来识别两个数据帧中不匹配的记录 两个数据帧的列,并且必须将它们从df1数据帧中排除

为此,我尝试了以下代码,但如果我删除 然后,所需数据将被删除

输入数据:-

预期输出:-

语法:-

请任何人都能帮我解决这个问题

提前感谢。

首先与left join一起使用,从
df2
中获取添加列的列名,并按它们过滤掉所有非
NaN
s行:

df = df1.merge(df2, on=['x1', 'x2', 'x3'], how='left', suffixes=('','_'))
print (df)
    x1  x2  x3  x4  x5  x6  x4_  x5_
0   SM   1   1   2   3   3  3.0  3.0
1   RK   2   2   3   4   5  NaN  NaN
2   NB   1   2   2   5   6  3.0  2.0
3   CB   2   5   6   7   8  NaN  NaN
4  VSB   5   6   4   2   1  3.0  2.0
5   SB   6   2   3   2   1  4.0  1.0

cols = df.columns.difference(df1.columns)
print (cols)
Index(['x4_', 'x5_'], dtype='object')

df = df.loc[df[cols].isnull().all(axis=1), df1.columns.tolist()]
print (df)
   x1  x2  x3  x4  x5  x6
1  RK   2   2   3   4   5
3  CB   2   5   6   7   8
编辑:

根据您的样本数据,我得到:

df = df1.merge(df2, on=['x1', 'x2', 'x3'], how='left', suffixes=('','_'))
print (df)
    x1  x2  x3  x4  x5  x6  x4_  x5_
0   SM   1   1   2   3   3  3.0  3.0
1   RK   2   2   3   4   5  NaN  NaN
2  NBR   1   2   2   5   6  NaN  NaN
3  CBK   2   5   6   7   8  NaN  NaN
4  VSB   5   6   4   2   1  3.0  2.0
5   SB   6   2   3   2   1  4.0  1.0

cols = df.columns.difference(df1.columns)
print (cols)
Index(['x4_', 'x5_'], dtype='object')

df = df.loc[df[cols].isnull().all(axis=1), df1.columns.tolist()].x1.tolist()
print (df)
    x1  x2  x3  x4  x5  x6
1   RK   2   2   3   4   5
2  NBR   1   2   2   5   6
3  CBK   2   5   6   7   8

执行内部合并将只保留
df1
中与
df2
中的记录匹配的记录:
df1.merge(df2,on=['col1','col2','col3',how='internal')
。这将排除任何不匹配的内容,以及
df1
中不在
df2
中的内容。不确定最后一个条件是否算作“不匹配”,如果您提供一些示例数据以及所需输出的示例,将非常有用。目前还不太清楚您在问什么。好的,我将添加。如果您的结果df在所有行中都有na,dropna将删除任何列中任何位置都有na的所有行,dropna(how='all')应用于您希望删除每列中所有值都为na的行。但是,如果发布示例df和预期df,则会有所帮助。如果两个数据帧记录的顺序相同,则会给出预期结果。如果我们更改数据帧中记录的顺序,它将不会给出预期的结果。您能检查一下吗?@neeraja-您认为交换
SM
CB
行吗?我认为它应该工作得很好。只有在df2中,而不是在df1中。好的,我会再检查一次。谢谢。它也工作得很好,但是在不同的情况下,它没有给我想要的输出。谢谢。
data_out=df1[~df1['x1','x2','x3'].isin(df2['x1','x2','x3'])]
data_out=data_out.dropna()
df = df1.merge(df2, on=['x1', 'x2', 'x3'], how='left', suffixes=('','_'))
print (df)
    x1  x2  x3  x4  x5  x6  x4_  x5_
0   SM   1   1   2   3   3  3.0  3.0
1   RK   2   2   3   4   5  NaN  NaN
2   NB   1   2   2   5   6  3.0  2.0
3   CB   2   5   6   7   8  NaN  NaN
4  VSB   5   6   4   2   1  3.0  2.0
5   SB   6   2   3   2   1  4.0  1.0

cols = df.columns.difference(df1.columns)
print (cols)
Index(['x4_', 'x5_'], dtype='object')

df = df.loc[df[cols].isnull().all(axis=1), df1.columns.tolist()]
print (df)
   x1  x2  x3  x4  x5  x6
1  RK   2   2   3   4   5
3  CB   2   5   6   7   8
df = df1.merge(df2, on=['x1', 'x2', 'x3'], how='left', suffixes=('','_'))
print (df)
    x1  x2  x3  x4  x5  x6  x4_  x5_
0   SM   1   1   2   3   3  3.0  3.0
1   RK   2   2   3   4   5  NaN  NaN
2  NBR   1   2   2   5   6  NaN  NaN
3  CBK   2   5   6   7   8  NaN  NaN
4  VSB   5   6   4   2   1  3.0  2.0
5   SB   6   2   3   2   1  4.0  1.0

cols = df.columns.difference(df1.columns)
print (cols)
Index(['x4_', 'x5_'], dtype='object')

df = df.loc[df[cols].isnull().all(axis=1), df1.columns.tolist()].x1.tolist()
print (df)
    x1  x2  x3  x4  x5  x6
1   RK   2   2   3   4   5
2  NBR   1   2   2   5   6
3  CBK   2   5   6   7   8