Как объединить кадры данных по двум столбцам одновременно - PullRequest
0 голосов
/ 17 октября 2019

У меня есть два кадра данных. Первый содержит данные о заказах: df_1 со столбцами ['uid','come ',' order_day '], который имеет 50415 строк. А второй содержит информацию о посещениях: df_2 со столбцами ['uid', 'source', 'session_day'] с 358532 строками. Я хочу получить источник клиента из данных о посетителях. Я пытаюсь объединить кадры данных по двум столбцам: result = df_1.merge(df_2, how=left ,left_on=['uid','order_day'],right_on=['uid','session_day']) Но в результате я получаю 62369 строк, и сумма столбца 'revenue' увеличивается. Я не понимаю, почему это происходит. Когда я пишу how='left', я ожидаю, что левый df_1 будет неизменным, и будут добавлены строки, которые похожи как в 'uid', так и '..._day' из df_2. Может кто-нибудь объяснить мне, почему я не получаю ожидаемый результат, и что я должен для этого сделать? Буду благодарен за любые комментарии

1 Ответ

0 голосов
/ 17 октября 2019

Число строк в результате слияния, превышающее количество строк в df_1 , можно объяснить на следующем примере:

df_1 содержит 2 строки:

   uid  revenue   order_day
0  111   200.01  2019-09-01
1  111   300.00  2019-09-02

df_2 содержит 5 строк:

   uid  source session_day
0  111   100.0  2019-09-01
1  111   200.0  2019-09-01
2  111   300.0  2019-09-02
3  111   400.5  2019-09-02
4  222   100.0  2019-09-03

Обратите внимание, что оно содержит:

  • Две строки с uid == 111 и session_day == 2019-09-01 , которые будут объединены со строкой с индексом 0 в df_1 .
  • Две строки с uid == 111 и session_day == 2019-09-02 , которые будут объединены со строкой с индексом 1 в df_1.

Вот почему результат слияния:

   uid  revenue   order_day  source session_day
0  111   200.01  2019-09-01   100.0  2019-09-01
1  111   200.01  2019-09-01   200.0  2019-09-01
2  111   300.00  2019-09-02   300.0  2019-09-02
3  111   300.00  2019-09-02   400.5  2019-09-02

Возможно, вы предположили, что слияние выполняется следующим образом:

  • Возьмите строку из df_1 .
  • Найдите df_2 для строки single с соответствующими столбцами соединения.
  • Если найдено, добавьте результат слияния (для этих 2 строк) к результату.
  • Reвыполните всю процедуру для следующих строк: df_1 .

На самом деле, "левое" слияние выполняется другим способом :

  • Возьмите строку из df_1 (назовем это базовая строка ).
  • Для каждая строка из df_2 с соответствующими столбцами соединения (если они найдены) генерируют строку в результате, состоящую из:
    • содержимого из базовой строки (из df_1 ),
    • содержимоготекущая строка (от df_2 ).

Если вы хотите объединить каждую строку из df_1 с вмаксимум 1 строка из df_2 , вы должны начинать с drop_duplacates с df_2 , с подмножеством , содержащим столбцы слияния.

...