pandas concat vs与M:M关系合并

问题描述 投票:0回答:1

使用pandas 0.24.2。 Merge, join & concatenate doc暗示merge方法正在调用concat()函数。我正在加入两个具有M:M关系的DataFrame,并希望更好地理解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

如何组装调用concat()函数的相同输出DataFrame?显然,这个例子是不正确的:

>>> 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

我可以使用与concat()函数具有M:M关系的DataFrame执行完全外连接吗?

python pandas dataframe
1个回答
0
投票

我不确定我是否完全明白这个问题。这两种方法旨在做不同的事情并给出不同的结果。如果要在公共密钥上组合数据框,可以使用merge()。如果要将所有数据从一个添加到另一个,请使用concat()。最接近我可以到达合并的数据框的是下面的,但不是左右之间的重复和/或缺少的ID,以及基于排序的不同值:

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
© www.soinside.com 2019 - 2024. All rights reserved.