首页 > 解决方案 > Python Pandas - 如何查找列值与两个数据框不同的行

问题描述

我正在尝试获取列中的值与两个数据框不同的行。

例如,假设我们有以下两个数据框:

import pandas as pd    
data1 = {'date' : [20210701, 20210704, 20210703, 20210705, 20210705],
    'name': ['Dave', 'Dave', 'Sue', 'Sue', 'Ann'],
     'a' : [1,0,1,1,0]}

data2 = {'date' : [20210701, 20210702, 20210704, 20210703, 20210705, 20210705],
    'name': ['Dave', 'Dave', 'Dave', 'Sue', 'Sue', 'Ann'],
     'a' : [1,0,1,1,0,0]}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

如您所见,Dave 在 20210704 的“a”列中具有不同的值,而 Sue 在 020210705 的“a”列中具有不同的值。因此,我希望的输出应该类似于:

import pandas as pd    
 output = {'date' : [20210704, 20210705],
        'name': ['Dave', 'Sue'],
         'a_from_old' : [0,1]}

df_output = pd.DataFrame(output)

minus statement如果我没记错的话,除非我遗漏了一些边缘情况,否则我所要求的内容与 SQL 中的内容几乎相同。

如何在列中找到日期和名称相同但值不同的行?

更新

我发现了一个极端情况,即某些数据甚至不在另一个数据框中,我想找到两个数据框中的数据,但“a”列中的值不同。

我编辑了样本数据集以考虑边缘情况。(请注意,20210702 上的 Dave 不会出现在最终输出中,因为数据不在第一个数据帧中)。

标签: pythonpandasdataframejoinconcatenation

解决方案


尝试merge()使用indicator=True然后过滤结果,query()然后删除额外的列drop()并使用以下方法将“a”重命名为“a_from_old” rename()

out=(df1.merge(df2,on=['date','name','a'],how='left',indicator=True)
        .query("_merge=='left_only'").drop('_merge',1)
        .rename(columns={'a':'a_from_old'}))

输出out

    date        name    a_from_old
2   20210704    Dave    0
4   20210705    Sue     1

注意:如果您要重命名更多列,请通过:

suffixes=('_from_old', '')merge()方法中作为参数


推荐阅读