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