问题描述
df1
data1 data2 data3
0 cow cat 53
1 girl boy 12
2 monkey island 30
3 lucas arts 14
df2
data1 data2 data3
0 girl boy 50
1 cover disc 45
2 girl boy 47
3 pen pencil 15
4 book note 30
5 lucas arts 15
df2
data1 data2 data3
0 cover disc 45
1 pen pencil 15
2 book note 30
我想从 df2 中删除那些在 df1 中具有相同 data1 和 data2 值的行,这样最后我将得到一个更新的 df2。到目前为止,我已经完成了以下工作:
file1="fileA.csv"
file2="fileB.csv"
df1=pd.read_csv(file1)
df2=pd.read_csv(file2)
cond = df1[['data1','data2']].isin(df2[['data1','data2']])
df2.drop(df1[cond].index,inplace=True)
df2.to_csv("fileBUpdtated.csv",index=False)
但是我没有得到我需要的结果,我错过了什么?
解决方法
cols = ['data1','data2']
df2 = df2.merge(df1[cols],on=cols,how='left',indicator=True)\
.loc[lambda x: x._merge.ne('both')].drop('_merge',axis=1)
print(df2)
data1 data2 data3
1 cover disc 45
3 pen pencil 15
4 book note 30
,
您可以将 df1
附加到 df2
,然后是 drop_duplicates
并保留左侧和来自 df2
的行
df2.append(df1,ignore_index=True).drop_duplicates(['data1','data2'],keep=False).loc[:df2.index.max()]
出:
data1 data2 data3
1 cover disc 45
3 pen pencil 15
4 book note 30
,
我发现这样做的最佳选择如下:
print (df2[~df2.isin(df1[['data1','data2']])])
在这里,您要针对 df1(子集数据帧中的 2 个特定列)中的值搜索 df2(超集数据帧)每一行中的值。如果没有找到,那么您想从 df2 打印这些记录。
这个不做合并。相反,它使用布尔值和索引。
输出结果为:
data1 data2 data3
1 cover disc 45
3 pen pencil 15
4 book note 30
或者,您可以执行以下操作:
您可以在两者中找到共同项,然后排除它们并打印值。
如果您想将它们从 df2 中删除,请将其重新分配回 df2。
common = df2.merge(df1,on=['data1','data2'])
df2 = df2[(~df2.data1.isin(common.data1))&(~df2.data2.isin(common.data2))]
print (df2)
输出结果为:
data1 data2 data3
1 cover disc 45
3 pen pencil 15
4 book note 30
,
让我们试试
out = df2[df2[['data1','data2']].apply(tuple,1).isin(df1[['data1',1))]