Pandas Match и unmatch на разных столбцах в Python - PullRequest
0 голосов
/ 18 октября 2019

Я хочу выполнить самостоятельное объединение на фрейме данных, где результирующие данные должны совпадать на 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 

Мой результирующий вывод должен быть [Здесь я хочу последний почтовый индексот каждого идентификатора, даже если идентификатор получил 2 разных почтовых индекса]

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 ]

2 голосов
/ 18 октября 2019

В 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 голос
/ 18 октября 2019

Вы можете сохранить дублирующиеся подмножества 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
0 голосов
/ 18 октября 2019

вы можете сделать это так же, как вы делаете это в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...