我有两个具有相同列名的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的记录,但其他任何列中的值都不同。预先感谢您的帮助!
答案 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.concat
,drop_duplicates
和duplicated
的一种方式:
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