Слияние 2 панд DataFrames с определенными условиями

Я не могу понять, как объединить 2 панды DataFrames с определенными условиями.

У меня есть это:

import pandas as pd

df1 = pd.DataFrame({'Name': ['A', 'A', 'A', 'B' ,'B' ,'B'],
                    'Date': ['10/15/2019', '10/16/2019', '10/17/2019', '10/15/2019', '10/16/2019', '10/17/2019'], 
                    'Value 1': [101, 102, 103, 201, 202, 203],
                    'Value 2': ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']})

df2 = pd.DataFrame({'Name': ['A', 'A', 'B', 'B' ,'C'],
                    'Date': ['10/14/2019', '10/15/2019', '10/13/2019', '10/18/2019', '10/18/2019'], 
                    'Value 3': [2, 2, 22, 44, 222]})

мне нужно добраться до этого

Мне нужно объединить только имена, которые существуют в df1, но добавить даты, которые существуют в df2. Однако эти даты должны быть больше 13.10.2019.

Самое близкое, что я мог получить, это

df_m = pd.merge(df1, df2, how='outer', left_on=['Name', 'Date'], right_on=['Name', 'Date'], sort=True)

Но сюда входит все ("C" из df2 - мне не нужно и дата 13.10.2019 для "B" - мне тоже не нужно).

Я был бы очень признателен за любую помощь.

Отредактировано: мы можем отказаться от условия даты больше 13.10.2019 - я понял это, только что создав еще один df2_mod, в котором я не включал даты, которые мне не нужны. Однако некоторые даты, существующие в df2_mod, отсутствуют в df1, и мне нужно объединить их со значениями 3. Однако мне не нужны имена из df2 в df1, которых нет в df1.


person user_unknown    schedule 24.12.2019    source источник
comment
Ваши требования неясны. Если вы берете все из df1 и df2, это внешнее соединение. Внешнее соединение всегда будет включать результат «C», потому что оно включает все из обоих фреймов данных. Затем, если вы подберете даты › 13.10.2019, результат C останется, потому что дата для этой записи — 18.10. Либо вы описываете что-то невозможное, либо вам нужно более четко сформулировать свои требования.   -  person Julian Drago    schedule 24.12.2019
comment
Итак, мне нужно выполнить 2 условия: 1. Объединить внешние, но не включать имена, которых нет в df1 2. Объединить все даты из df2, даже если они не существуют в df1.   -  person user_unknown    schedule 24.12.2019
comment
Я обновил свой первоначальный вопрос. Спасибо.   -  person user_unknown    schedule 24.12.2019


Ответы (1)


Вот одно решение (я не фильтрую даты, превышающие 13.10.2019, как указано в обновленном вопросе):

  1. Сначала мы фильтруем df2 и удаляем все 'Names', которых нет в df1.
  2. Выполните внешнее соединение с df1 и df2_filtered в столбцах «Имя» и «Дата».
  3. Сортировка значений и воссоздание индекса

import pandas as pd

df1 = pd.DataFrame({'Name': ['A', 'A', 'A', 'B' ,'B' ,'B'],
                    'Date': ['10/15/2019', '10/16/2019', '10/17/2019', '10/15/2019', '10/16/2019', '10/17/2019'],
                    'Value 1': [101, 102, 103, 201, 202, 203],
                    'Value 2': ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']})

df2 = pd.DataFrame({'Name': ['A', 'A', 'B', 'B' ,'C'],
                    'Date': ['10/14/2019', '10/15/2019', '10/13/2019', '10/18/2019', '10/18/2019'],
                    'Value 3': [2, 2, 22, 44, 222]})

df2_filtered = df2[df2['Name'].isin(df1['Name'])]       # we want df2 rows with `Names` that exists in df1
print(df1.merge(df2_filtered, on=['Name', 'Date'], how='outer').sort_values(['Name', 'Date']).reset_index(drop=True))

Отпечатки:

  Name        Date  Value 1 Value 2  Value 3
0    A  10/14/2019      NaN     NaN      2.0
1    A  10/15/2019    101.0      A1      2.0
2    A  10/16/2019    102.0      A2      NaN
3    A  10/17/2019    103.0      A3      NaN
4    B  10/13/2019      NaN     NaN     22.0
5    B  10/15/2019    201.0      B1      NaN
6    B  10/16/2019    202.0      B2      NaN
7    B  10/17/2019    203.0      B3      NaN
8    B  10/18/2019      NaN     NaN     44.0
person Andrej Kesely    schedule 24.12.2019
comment
Большое спасибо, это имеет смысл! Я проголосовал за ответ! Это мне очень помогает! - person user_unknown; 25.12.2019