我正在尝试基于同一列在熊猫中合并2个数据框。阅读有关合并的文档,我所做的一切都暗示了数据框应在指定的列上合并,同时仅保留公共值。它肯定会保留通用值,但会生成一个庞大的数据框,对于“左”数据框中的每个索引,它基本上都是一个完整的“右”数据框。
我的左数据框是
left
Out[325]:
A B C D MergeThis
0 38 43 20 34 -N2
1 14 44 23 91 -N2
2 55 50 30 92 -N2
3 29 20 56 0 -N2
4 61 6 38 44 -N2
5 18 61 30 7 -N2
6 67 45 60 81 -N2
7 7 53 60 72 +N2
8 15 46 0 82 +N2
9 6 90 83 36 +N2
10 0 87 64 82 +N2
11 13 22 13 39 +N2
12 65 88 50 34 +N2
13 35 31 72 34 +N2
我的正确数据框是
right
Out[326]:
E F G H MergeThis
0 22 81 97 28 +N2
1 20 4 44 48 +N2
2 19 41 52 25 +N2
3 30 37 66 24 +N2
4 32 40 56 92 +N2
5 95 76 91 31 +N2
6 36 66 17 85 +N2
很明显,我试图在“ MergeThis”列上进行合并,以使最终得到的是 + N2 值的组合,列分别来自“ left”和“ right”。但是,我最终却遇到了奇怪的事情:
left.merge(right, on='MergeThis')
Out[327]:
A B C D MergeThis E F G H
0 7 53 60 72 +N2 22 81 97 28
1 7 53 60 72 +N2 20 4 44 48
2 7 53 60 72 +N2 19 41 52 25
3 7 53 60 72 +N2 30 37 66 24
4 7 53 60 72 +N2 32 40 56 92
5 7 53 60 72 +N2 95 76 91 31
6 7 53 60 72 +N2 36 66 17 85
7 15 46 0 82 +N2 22 81 97 28
8 15 46 0 82 +N2 20 4 44 48
9 15 46 0 82 +N2 19 41 52 25
10 15 46 0 82 +N2 30 37 66 24
11 15 46 0 82 +N2 32 40 56 92
12 15 46 0 82 +N2 95 76 91 31
13 15 46 0 82 +N2 36 66 17 85
14 6 90 83 36 +N2 22 81 97 28
15 6 90 83 36 +N2 20 4 44 48
16 6 90 83 36 +N2 19 41 52 25
17 6 90 83 36 +N2 30 37 66 24
18 6 90 83 36 +N2 32 40 56 92
19 6 90 83 36 +N2 95 76 91 31
20 6 90 83 36 +N2 36 66 17 85
21 0 87 64 82 +N2 22 81 97 28
22 0 87 64 82 +N2 20 4 44 48
23 0 87 64 82 +N2 19 41 52 25
24 0 87 64 82 +N2 30 37 66 24
25 0 87 64 82 +N2 32 40 56 92
26 0 87 64 82 +N2 95 76 91 31
27 0 87 64 82 +N2 36 66 17 85
28 13 22 13 39 +N2 22 81 97 28
29 13 22 13 39 +N2 20 4 44 48
30 13 22 13 39 +N2 19 41 52 25
31 13 22 13 39 +N2 30 37 66 24
32 13 22 13 39 +N2 32 40 56 92
33 13 22 13 39 +N2 95 76 91 31
34 13 22 13 39 +N2 36 66 17 85
35 65 88 50 34 +N2 22 81 97 28
36 65 88 50 34 +N2 20 4 44 48
37 65 88 50 34 +N2 19 41 52 25
38 65 88 50 34 +N2 30 37 66 24
39 65 88 50 34 +N2 32 40 56 92
40 65 88 50 34 +N2 95 76 91 31
41 65 88 50 34 +N2 36 66 17 85
42 35 31 72 34 +N2 22 81 97 28
43 35 31 72 34 +N2 20 4 44 48
44 35 31 72 34 +N2 19 41 52 25
45 35 31 72 34 +N2 30 37 66 24
46 35 31 72 34 +N2 32 40 56 92
47 35 31 72 34 +N2 95 76 91 31
48 35 31 72 34 +N2 36 66 17 85
实质上,这为我的“正确”数据框的每个索引创建了一个重复的数据框。
一方面,我知道如何执行另一种解决方法,以使用更多代码获取所需的数据框,并进一步分解其中一个数据框,以使合并“更漂亮”。但是,我真的想知道为什么会这样吗?我希望将来能够使用合并功能,但我不完全了解熊猫为达到此目的正在做些什么。
非常感谢您的帮助。
答案 0 :(得分:1)
结果看起来正确。联接条件是将left
等于MergeThis
的{{1}}的每一行联接到具有该匹配条件的+N2
的每一行。每个数据帧中有7个这样的行,因此输出中有49个行集的笛卡尔积。
请注意,right
的合并类型为DataFrame.merge
,left
,right
和inner
,它们确定要使用的密钥集对于连接,而不是限制哪些行将与其他哪些行匹配。默认值outer
仅意味着使用inner
和left
之间的联接列中包含的值的交集,无论如何它们都将是right
。如果您使用+N2
,则将获得相同的结果,因为正确的DataFrame对此列仅包含right
。同样,如果您使用+N2
或left
,则在这种情况下它们会彼此相同,因为二者都会导致可能的匹配集基于outer
或{ {1}},您将从-N2
的所有成对匹配以及+N2
的其他各行中获得49行(但它们没有其他匹配项,并且+N2
的值则来自-N2
的列)。
从它的声音来看,您可能希望将NaN
中的right
的7行仅附加到+N2
,并在其他行中填充right
。为此,您应该使用 concatenation 而不是基于合并的连接。
下面是一个使用left
(类似的玩具数据)的示例(完成后,您只需删除多余的NaN
列即可)
pandas.concat