如何在一个列中查找具有相同值但在另一列中具有不同值的记录

时间:2019-07-31 18:11:41

标签: python pandas dataframe

我有两个具有相同列名的pandas df。这些列之一名为id_number,它对每个表都是唯一的(我的意思是id_number在每个df中只能出现一次)。我想查找具有相同id_number但在任何列中至少具有一个不同值的所有记录,并将这些记录存储在新的pandas df中。

我尝试合并(更具体地讲是内部联接),但是它仅保留具有该特定id_number的一条记录,因此我无法查找两个df之间的任何差异。

让我提供一些示例以提供更清晰的解释:

示例dfs:

第一个DF:

id_number    name    type    city
    1        John    dev     Toronto
    2        Alex    dev     Toronto
    3        Tyler   dev     Toronto
    4        David   dev     Toronto
    5        Chloe   dev     Toronto

第二个DF:

id_number    name    type    city
    1        John    boss    Vancouver
    2        Alex    dev     Vancouver
    4        David   boss    Toronto
    5        Chloe   dev     Toronto
    6        Kyle    dev     Vancouver

我希望生成的df包含以下记录:

id_number    name    type    city
    1        John    dev     Toronto
    1        John    boss    Vancouver
    2        Alex    dev     Toronto
    2        Alex    dev     Vancouver
    4        David   dev     Toronto
    4        David   Boss    Toronto

注意:我不希望id_number 5的记录出现在结果df中,这是因为id_number 5的记录在两个df中都完全相同。

实际上,每条记录有80列,但是我认为这些表使我的观点更加清楚。再次总结一下,我希望得到的df包含具有相同id_numbers的记录,但其他任何列中的值都不同。预先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这是使用nunique的一种方法,然后我们选择的id_number多于1并将它们切成薄片

s = pd.concat([df1, df2])
s = s.loc[s.id_number.isin(s.groupby(['id_number']).nunique().gt(1).any(1).loc[lambda x : x].index)]
s
Out[654]: 
   id_number   name  type       city
0          1   John   dev    Toronto
1          2   Alex   dev    Toronto
3          4  David   dev    Toronto
0          1   John  boss  Vancouver
1          2   Alex   dev  Vancouver
2          4  David  boss    Toronto

答案 1 :(得分:1)

这是使用pd.concatdrop_duplicatesduplicated的一种方式:

pd.concat([df1, df2]).drop_duplicates(keep=False).sort_values('id_number')\
  .loc[lambda x: x.id_number.duplicated(keep=False)]

输出:

   id_number   name  type       city
0          1   John   dev    Toronto
0          1   John  boss  Vancouver
1          2   Alex   dev    Toronto
1          2   Alex   dev  Vancouver
3          4  David   dev    Toronto
2          4  David  boss    Toronto