отношения панд против слияния с отношениями М: М - PullRequest
0 голосов
/ 19 марта 2019

Использование панд 0.24.2. Документ Merge, join & concatenate doc подразумевает, что метод слияния вызывает функцию concat (). Я объединяю два DataFrames с отношением M: M и хочу лучше понять, как работает функция concat (). Этот код вызывает метод merge () и возвращает ожидаемые результаты:

>>> import pandas as pd
>>> left = pd.DataFrame([['001', 4123],
...                      ['001', 4855],
...                      ['001', 4761],
...                      ['002', 4991],
...                      ['003', 5001],
...                      ['004', 3999],
...                      ['004', 4175],
...                      ['004', 4101]],
...         columns=['ID', 'Value_l'])
>>> right = pd.DataFrame([['004', 1111],
...                       ['004', 1234],
...                       ['004', 1133],
...                       ['002', 1921],
...                       ['003', 2001],
...                       ['001', 2222]],
...         columns=['ID', 'Value_r'])

>>> merge_lr = pd.merge(left, right, how='outer', sort=True)
>>> print(merge_lr)
     ID  Value_l  Value_r
0   001     4123     2222
1   001     4855     2222
2   001     4761     2222
3   002     4991     1921
4   003     5001     2001
5   004     3999     1111
6   004     3999     1234
7   004     3999     1133
8   004     4175     1111
9   004     4175     1234
10  004     4175     1133
11  004     4101     1111
12  004     4101     1234
13  004     4101     1133

Как собрать тот же выходной DataFrame, вызывающий функцию concat ()? Ясно, что этот пример неверен:

>>> merge_lr2 = pd.concat([left, right], axis=0, join='outer', sort=True, ignore_index=True)
>>> print(merge_lr2)
     ID  Value_l  Value_r
0   001   4123.0      NaN
1   001   4855.0      NaN
2   001   4761.0      NaN
3   002   4991.0      NaN
4   003   5001.0      NaN
5   004   3999.0      NaN
6   004   4175.0      NaN
7   004   4101.0      NaN
8   004      NaN   1111.0
9   004      NaN   1234.0
10  004      NaN   1133.0
11  002      NaN   1921.0
12  003      NaN   2001.0
13  001      NaN   2222.0

Могу ли я выполнить полное внешнее соединение с DataFrames, имеющими отношение M: M, с функцией concat ()?

1 Ответ

0 голосов
/ 19 марта 2019

Я не уверен, что понимаю вопрос.Эти два метода предназначены для разных целей и дают разные результаты.Если вы хотите объединить кадры данных на общих ключах, используйте merge().Если вы хотите добавить все данные из одного в другой, вы используете concat().Ниже приведен пример ближайшего к объединенному фрейму данных, но не дублированные и / или отсутствующие идентификаторы между левым и правым, а также различные значения, основанные на сортировке:

merge_lr2 = pd.concat([left, right], axis=0, join='outer', sort=True, ignore_index=True)\
            .sort_values(['ID','Value_l','Value_r'])\
            .fillna(method='ffill')\
            .fillna(method='bfill')
print(merge_lr2)

     ID  Value_l  Value_r
0   001   4123.0   2222.0
2   001   4761.0   2222.0
1   001   4855.0   2222.0
13  001   4855.0   2222.0
3   002   4991.0   2222.0 <<<
11  002   4991.0   1921.0
4   003   5001.0   1921.0 <<<
12  003   5001.0   2001.0
5   004   3999.0   2001.0
7   004   4101.0   2001.0
6   004   4175.0   2001.0
8   004   4175.0   1111.0
10  004   4175.0   1133.0
9   004   4175.0   1234.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...