熊猫在Python中不同列上的匹配和不匹配

时间:2019-10-18 14:48:38

标签: python pandas dataframe

我想在一个数据帧上执行自联接,其中结果数据应在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

3 个答案:

答案 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)

您可以保留IDUPDATE_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()