我正在尝试基于一个公共列合并pandas中的2个数据帧。在阅读有关合并的文档时,我所做的每一件事都暗示了dataframes应该在指定的列上合并,同时只保留公共值。它当然会保留公共值,但会生成一个庞大的数据帧,对于“左”数据帧中的每个索引,它本质上是一个完整的“右”数据帧。你知道吗
我左边的数据框是
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
的合并类型是left
、right
、inner
和outer
,它们决定了用于连接的键集,而不是限制哪些行将与哪些其他行匹配。默认的inner
只意味着在left
和right
之间使用包含在联接列中的值的交集,反正就是+N2
。如果您使用right
,您将得到相同的结果,因为正确的数据帧只包含该列的+N2
。同样地,如果您使用left
或outer
,它们在本例中恰好相同,因为这两种情况都会导致可能的匹配集基于-N2
或+N2
,并且您将从+N2
的所有成对匹配中获得49行,再加上-N2
的其他行(但没有其他匹配),以及NaN
列的值,在这种情况下,这些值将来自right
)。你知道吗听上去,你可能已经预料到
right
中的7行+N2
会被附加到left
,而其他行则被NaN
填充。要实现这一点,应该使用连接而不是基于合并的连接。你知道吗下面是一个使用
pandas.concat
的类似玩具数据的示例(完成后只需删除额外的MergeThis
列即可)相关问题 更多 >
编程相关推荐