我想在一个数据帧上执行自联接,其中结果数据应在2列上匹配,而在另一列上不匹配。
ID NAME POST_CODE UPDATE_DATE
1 David 45678 20/12/2012
1 David 50010 20/12/2012
2 Peter 23234 12/12/2014
3 Venk 12122 05/10/2018
4 Mark 23232 03/05/2017
5 Harry 15785 03/04/2015
5 Harry 89897 01/04/2019
我的最终输出应该是[即使每个ID有2个不同的邮政编码,我也要从这里获得每个ID的最新邮政编码]
ID NAME POST_CODE UPDATE_DATE
1 David 45678 20/12/2012
1 David 50010 20/12/2012
如果是SQL,我将使用此查询。
SELECT DISTINCT A.ID, A.NAME, A.POST_CODE, A.UPDATE_DATE
FROM TABLE A
inner join (SELECT A.ID, A.NAME, A.POST_CODE, A.UPDATE_DATE FROM TABLE) as B
ON A.ID = B.ID and A.POST_CODE <> B.POST_CODE and A.UPDATE_DATE = B.UPDATE_DATE
答案 0 :(得分:2)
在pandas
中,我们可以使用filter
df.groupby(['ID','NAME','UPDATE_DATE']).filter(lambda x : x['POST_CODE'].nunique()!=1 )
ID NAME POST_CODE UPDATE_DATE
0 1 David 45678 20/12/2012
1 1 David 50010 20/12/2012
答案 1 :(得分:1)
您可以保留ID
和UPDATE_DATE
的重复子集,然后删除重复的POST_CODE
的所有行。
df[df.duplicated(subset=['ID', 'UPDATE_DATE'], keep=False)].drop_duplicates(subset=['POST_CODE'], keep=False)
ID NAME POST_CODE UPDATE_DATE
0 1 David 45678 20/12/2012
1 1 David 50010 20/12/2012
答案 2 :(得分:0)
您可以类似地使用合并方法在sql中进行操作
## get only rows with duplicated ID and UPDATE_DATE
df2 = df[df["UPDATE_DATE"].duplicated(keep=False)]
## do inner join and take columns of 1st table only then drop duplicates
df2.merge(df2, on=["ID", "UPDATE_DATE"], how="inner", suffixes=["", "_2"]).iloc[:,:-2].drop_duplicates()