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

2024-09-28 17:17:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

以下是一个例子:

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

df2 = pd.DataFrame({'Filename':['image1','image2','image3'], 
                    'Name':['Dog','Cat', 'Cat'],
                     '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,如下所示。我的目标是比较df1df2values列与相同的FilenameName

df1

Filename    Name    values

0   image1  Dog 2

2   image2  Cat 4

3   image3  Cat 5

df2

Filename    Name    values

0   image1  Dog 5

1   image2  Cat 6

2   image3  Cat 7

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

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

我还尝试实现groupby并与rows进行比较,但我遇到了ValueError: Can only compare identically-labeled Series objects,因为索引不一样

有人能帮我吗?我试图寻找类似的问题,但没有遇到任何问题


Tags: nameindataframeforfilenamecatrowspd
2条回答

这是一个不太像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) 

相关问题 更多 >