Левое соединение с датой и столбцом идентификатора - PullRequest
0 голосов
/ 16 июня 2020

1 [left null join] 1

Допустим, это CSV1:

STARTDATE | ENDDATE | ПУНКТ | CSV1UQID

1999-09-27 | 9999-12-31 | 100000 | 121

1999-10-27 | 9999-12-31 | 100001 | 123

1222-09-27 | 9999-12-31 | 999999 | 125

и CSV2:

CSV2STARTDATE | CSV2ENDDATE | ITEMID

1998-09-27 | 9999-12-31 | 100000

1999-10-27 | 9999-12-31 | 100001

Я хотел бы объединить эти таблицы на основе их столбцов, в частности STARTDATE, ENDDATE или ITEMID в их различиях, чтобы показать, являются ли их различия уникальными для фреймов данных. Я сократил исходные фреймы данных csv1 и csv2 соответственно, поскольку они включают более 5000 строк, поэтому было бы хорошо, если бы данные отображались аккуратно.

Вот результаты, которые я хотел бы получить с нулевым левым соединением (иначе CSV1 эксклюзивы):

STARTDATE | ENDDATE | ПУНКТ | CSV1UQID

1999-09-27 | 9999-12-31 | 100000 | 121 (эта строка находится в левом соединении, null, потому что дата начала уникальна для CSV1 по сравнению с CSV2STARTDATE)

1222-09-27 | 9999-12-31 | 999999 | 125 (потому что все параметры уникальны для CSV1)

Однако пока мой код для left-join (null) таков:

csv1iID = csv1.set_index('ITEMID')
csv2iID = csv2.set_index('ITEMID')

CSV1only = csv1.join(
    csv2iID,
    on = 'ITEMID', 
    lsuffix = '_l',
    rsuffix = '_r',
).query('ITEMID_r.isnull()')

Но это дает только:

STARTDATE | ENDDATE | ITEMID | CSV1UQID

1222-09-27 | 9999-12-31 | 999999 | 125

, потому что он смотрит только на различия ITEMID, а не на дату. Как я могу исправить это, чтобы получить желаемый результат?

См. Строку, в которой есть >>

1 Ответ

0 голосов
/ 16 июня 2020

Индикаторный параметр внешнего соединения будет возвращать значения в левом, правом или обоих значениях. Вы можете отфильтровать полученный df по df['_merge'] == 'left_only', чтобы получить только левые записи, et c.

df1

STARTDATE       ENDDATE     ITEMID  CSV1UQID
0   1999-09-27  9999-12-31  100000  121
1   1999-10-27  9999-12-31  100001  123
2   1222-09-27  9999-12-31  999999  125

df2

STARTDATE       ENDDATE     ITEMID
0   1998-09-27  9999-12-31  100000
1   1999-10-27  9999-12-31  100001


df1.merge(df2, how='outer', on=['STARTDATE','ENDDATE','ITEMID'], indicator=True)  

Output

    STARTDATE   ENDDATE     ITEMID  CSV1UQID    _merge
0   1999-09-27  9999-12-31  100000  121.0       left_only
1   1999-10-27  9999-12-31  100001  123.0       both
2   1222-09-27  9999-12-31  999999  125.0       left_only
3   1998-09-27  9999-12-31  100000  NaN         right_only
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...