Pandas эквивалент SQL не существует подзапроса - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь удалить определенные строки из таблицы Панд. По сути, это упражнение на дедупликацию:

У меня есть стол

           id          sub_id1       sub_id2              date       
0           1           424755           101        2018-09-21      
1           2           424755           101        2018-09-21
2           3           424755           102        2018-09-21
3           4           678321           101        2018-09-21
4           5           678321           102        2018-09-22
5           6           424755           102        2018-09-22

Я хочу удалить строку, если есть другая строка, которая соответствует sub_id1 и date, но имеет более низкий sub_id2.

SQL, который я написал бы для этого, был бы

select * from table t
where not exists (select 1 from table
                  where sub_id1=t.sub_id1
                  and date=t.date
                  and sub_id2<t.sub_id2)

Результирующая таблица будет

           id          sub_id1       sub_id2              date       
0           1           424755           101        2018-09-21      
1           2           424755           101        2018-09-21
2           4           678321           101        2018-09-21
3           5           678321           102        2018-09-22
4           6           424755           102        2018-09-22

Где id=3 удалено, потому что есть строки, которые имеют точно такой же sub_id1 и столбец даты, что и он, с более низким sub_id2.

Попытка выяснить это с помощью слияний Панд. Спасибо!

1 Ответ

0 голосов
/ 01 ноября 2018

Это больше похоже на groupby задачу + min значение среза (я использую transform min здесь)

s=df.groupby(['sub_id1','date']).sub_id2.transform('min')
df[df.sub_id2==s]
Out[146]: 
   id  sub_id1  sub_id2        date
0   1   424755      101  2018-09-21
1   2   424755      101  2018-09-21
3   4   678321      101  2018-09-21
4   5   678321      102  2018-09-22
5   6   424755      102  2018-09-22

where sub_id1=t.sub_id1 and date=t.date: df.groupby(['sub_id1','date'])

sub_id2<t.sub_id2: df.sub_id2==s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...