比较2个数据框列并删除行

问题描述

我有2个长度不同的dataframes。我想比较并删除df1中的不可用值(rows)。

这里是一个例子:

df1 = pd.DataFrame({'Filename':['image1','image1','image2','image3'],'Name':['Dog','Cat','Cat'],'values':['2','3','4','5']  })

df2 = pd.DataFrame({'Filename':['image1','values':['5','6','7']  })

df1

Filename    Name    values

0   image1  Dog 2

1   image1  Cat 3

2   image2  Cat 4

3   image3  Cat 5

df2

Filename    Name    values

0   image1  Dog 5

1   image2  Cat 6

2   image3  Cat 7

我期望2个数据帧(df1和df2)具有相同的长度和相同的FilenameName,如下所示。我的目标是将valuesdf1的{​​{1}}列与相同的df2Filename进行比较。

Name

df1

Filename Name values 0 image1 Dog 2 2 image2 Cat 4 3 image3 Cat 5

df2

我尝试将每行与相应的df进行比较,如果不可用,请删除。 (显然这不是方法)

Filename    Name    values

0   image1  Dog 5

1   image2  Cat 6

2   image3  Cat 7

我还尝试实现groupby并与行进行比较,由于索引不同,因此遇到了for i,j in df1.iterrows(): for m,n in df1.iterrows(): if m['Filename'] == i['Filename']: if m['LabelName'] == i['LabelName']: pass else: print('delete') df2=df2.drop(i) df1=df1.sort_values('Filename') df2=df2.sort_values('Filename') break

有人可以帮我吗?我尝试搜索类似的问题,但没有遇到任何问题。

解决方法

一个不是Python的解决方案,但是它可以完成工作:

l1=[(df1.Filename.iloc[i],df1.Name.iloc[i]) for i in range(len(df1))]
l2=[(df2.Filename.iloc[i],df2.Name.iloc[i]) for i in range(len(df2))]
lfin=[i for i in l1 if i in l2]
   
for i in df1.index:
    if (df1.Filename.loc[i],df1.Name.loc[i]) not in lfin:
        df1.drop(i,inplace=True)

for i in df2.index:
    if (df2.Filename.loc[i],df2.Name.loc[i]) not in lfin:
        df2.drop(i,inplace=True)
,

嘿,我认为这个工作很好

df3 = df2.set_index('Filename')
df1[df1.apply(lambda x : df3.loc[x.Filename]['Name']== x.Name,axis =1 ) ]

如果您要丢失索引并重置索引,可以添加

df3 = df2.set_index('Filename')
df1[df1.apply(lambda x : df3.loc[x.Filename]['Name']== x.Name,axis =1 )  ].reset_index().drop('index',axis=1) 

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...