如何解决比较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)具有相同的长度和相同的Filename
和Name
,如下所示。我的目标是将values
和df1
的{{1}}列与相同的df2
和Filename
进行比较。
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。