合并熊猫中的常见列值会产生错误的数据框

时间:2018-12-06 19:15:41

标签: python pandas merge

我正在尝试基于同一列在熊猫中合并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

实质上,这为我的“正确”数据框的每个索引创建了一个重复的数据框。

一方面,我知道如何执行另一种解决方法,以使用更多代码获取所需的数据框,并进一步分解其中一个数据框,以使合并“更漂亮”。但是,我真的想知道为什么会这样吗?我希望将来能够使用合并功能,但我不完全了解熊猫为达到此目的正在做些什么。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

结果看起来正确。联接条件是将left等于MergeThis的{​​{1}}的每一行联接到具有该匹配条件的+N2的每一行。每个数据帧中有7个这样的行,因此输出中有49个行集的笛卡尔积。

请注意,right的合并类型为DataFrame.mergeleftrightinner,它们确定要使用的密钥集对于连接,而不是限制哪些行将与其他哪些行匹配。默认值outer仅意味着使用innerleft之间的联接列中包含的值的交集,无论如何它们都将是right。如果您使用+N2,则将获得相同的结果,因为正确的DataFrame对此列仅包含right。同样,如果您使用+N2left,则在这种情况下它们会彼此相同,因为二者都会导致可能的匹配集基于outer或{ {1}},您将从-N2的所有成对匹配以及+N2的其他各行中获得49行(但它们没有其他匹配项,并且+N2的值则来自-N2的列)。

从它的声音来看,您可能希望将NaN中的right的7行仅附加到+N2,并在其他行中填充right 。为此,您应该使用 concatenation 而不是基于合并的连接。

下面是一个使用left(类似的玩具数据)的示例(完成后,您只需删除多余的NaN列即可)

pandas.concat