我有两个熊猫数据帧,它们有一些共同的行
假设dataframe2是dataframe1的子集
如何获取dataframe1中不在dataframe2中的行?
数据帧(数据={‘col1’:[1,2,3,4,5],’col2’:[10,11,12,13,14])
数据帧(数据={‘col1’:[1,2,3],’col2’:[10,11,12]})
df1
col1 col2
0 1 10
1 2 11
2 3 12
3 4 13
4 5 14
df2
col1 col2
0 1 10
1 2 11
2 3 12
预期结果:
col1 col2
3 4 13
4 5 14
当前选择的解决方案产生不正确的结果。为了正确解决这个问题,我们可以执行从df1到df2的左连接,确保首先只获取df2的唯一行
首先,我们需要修改原始数据框以添加包含数据的行[3,10]
df1=pd.DataFrame(数据={'col1':[1,2,3,4,5,3],
‘col2’:[10,11,12,13,14,10]})
df2=pd.DataFrame(数据={'col1':[1,2,3],
'col2':[10,11,12]})
df1
col1 col2
0 1 10
1 2 11
2 3 12
3 4 13
4 5 14
5 3 10
df2
col1 col2
0 1 10
1 2 11
2 3 12
执行左连接,消除df2中的重复项,以便df1的每一行与df2的整整一行连接。使用参数indicator返回一个额外的列,指示行来自哪个表
df_all=df1.merge(df2.drop_duplicates(),on=['col1','col2'],
how='left',indicator=True)
所有
col1 col2\u合并
0 1 10两者
1 2 11两者
2 3 12两者
3 4 13仅左
4 5 14仅左
5 3 10只左
创建布尔条件:
df_all[''u merge']=='left_only'
0错误
1错误
2错误
3正确
4正确
5对
名称:_merge,数据类型:bool
为什么其他解决方案是错误的
一些解决方案也会犯同样的错误——它们只检查每个值在每列中是独立的,而不是在同一行中。添加最后一行(该行是唯一的,但具有来自df2的两列的值)会暴露错误:
common=df1.merge(df2,on=['col1','col2'])
(~df1.col1.isin(common.col1))&;(~df1.col2.isin(common.col2))
0错误
1错误
2错误
3正确
4正确
5错误
数据类型:bool
此解决方案会得到相同的错误结果:
df1.isin(df2.to_dict('l')).all(1)