【问题标题】:Compare 2 dataframe columns and delete rows比较 2 个数据框列并删除行
【发布时间】:2020-09-06 09:04:40
【问题描述】:

我有 2 个不同长度的 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 并与行进行比较,我遇到了ValueError: Can only compare identically-labeled Series objects,因为索引不一样。

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

【问题讨论】:

  • 你的预期输出是什么?
  • ++添加了更多描述
  • 你应该使用pd.merge。像df1.merge(df2, on=['Filename', 'Name'], how='inner') 这样的东西应该可以工作。但是,您的问题肯定是重复的,您可以在其他地方找到答案:)
  • 我觉得自己很愚蠢。谢谢

标签: python pandas data-science string-comparison data-processing


【解决方案1】:

一个不那么 Pythonic 的解决方案,但它确实有效:

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)

【讨论】:

    【解决方案2】:

    嘿,我认为这很好用

    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) 
    

    【讨论】:

    • 谢谢阿明。我想我在 cmets 部分找到了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多