Python 合并Pandas中的公共列值会产生不正确的数据帧
我正试图基于一个公共列合并pandas中的2个数据帧。在阅读关于合并的文档时,我所做的一切都暗示数据帧应该合并到指定的列上,同时只保留公共值。它当然会保留公共值,但会生成大量数据帧,对于“左”数据帧中的每个索引,该数据帧本质上是一个完整的“右”数据帧 我左边的数据框是Python 合并Pandas中的公共列值会产生不正确的数据帧,python,pandas,merge,Python,Pandas,Merge,我正试图基于一个公共列合并pandas中的2个数据帧。在阅读关于合并的文档时,我所做的一切都暗示数据帧应该合并到指定的列上,同时只保留公共值。它当然会保留公共值,但会生成大量数据帧,对于“左”数据帧中的每个索引,该数据帧本质上是一个完整的“右”数据帧 我左边的数据框是 left Out[325]: A B C D MergeThis 0 38 43 20 34 -N2 1 14 44 23 91 -N2 2 55 50
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
它基本上为我的“右”数据帧的每个索引创建了一个重复的数据帧
一方面,我知道如何做另一种变通方法,用更多的代码获得我想要的数据帧,并进一步分解其中一个数据帧,从而使合并更“漂亮”。然而,我真的很想知道为什么会发生这种情况?我希望将来能够使用合并功能,但我不完全理解pandas试图做什么来产生这种效果
非常感谢您的帮助。结果看起来是正确的。联接条件适用于
left
的每一行,其中MergeThis
等于+N2
将联接到具有该匹配条件的right
的每一行。在每个数据帧中有7个这样的行,因此在输出中有49行是行集的笛卡尔积
请注意,DataFrame.merge
的合并类型是左
、右
、内
和外
,它们决定了用于联接的键集,而不是限制哪些行将与哪些其他行匹配。internal
的默认值仅意味着使用left
和right
之间的联接列中包含的值的交点,无论如何,该交点将仅为+N2
。如果您使用right
,您将得到相同的结果,因为右数据帧仅包含此列的+N2
。同样,如果您使用left
或outer
,在这种情况下,它们将碰巧彼此相同,因为这两种情况都会导致可能的匹配集基于-N2
或+N2
,并且您将从+N2
的所有成对匹配以及-N2
的其他行中获得49行(但没有额外的匹配项,在这种情况下,right
中的列的NaN
值)
从它的声音来看,您可能希望右侧
中的7行+N2
仅附加到左侧
,并为其他行填充NaN
。要实现这一点,您应该使用连接而不是基于合并的连接
下面是一个使用pandas.concat
的类似玩具数据的示例(完成后,您可以删除额外的MergeThis
列)
您想要的数据帧是什么样子的?是的,我认为这就是解决方案。我的计划是,如果我想不出来,就告诉我们concat,似乎我是对的。接下来的问题是,文档中的“merge”命令似乎创建了所需的输出(或类似的内容)。这是因为“key”列包含每个索引的唯一值?[K0,K1,K2]。
In [42]: right
Out[42]:
C D MergeThis
0 1 2 +N2
1 3 4 +N2
2 5 6 +N2
3 7 8 +N2
In [43]: left
Out[43]:
A B MergeThis
0 1 2 -N2
1 3 4 -N2
2 5 6 +N2
3 7 8 +N2
4 9 10 +N2
5 11 12 +N2
In [44]: right.index = left[left.MergeThis == '+N2'].index.values
In [45]: right
Out[45]:
C D MergeThis
2 1 2 +N2
3 3 4 +N2
4 5 6 +N2
5 7 8 +N2
In [46]: pandas.concat([left, right], axis=1)
Out[46]:
A B MergeThis C D MergeThis
0 1 2 -N2 NaN NaN NaN
1 3 4 -N2 NaN NaN NaN
2 5 6 +N2 1.0 2.0 +N2
3 7 8 +N2 3.0 4.0 +N2
4 9 10 +N2 5.0 6.0 +N2
5 11 12 +N2 7.0 8.0 +N2