熊猫“加入”古怪

时间:2018-06-17 17:58:54

标签: python pandas join merge

如果我尝试这个(有两个不同的pandas年份,一个在Python 2中,另一个在Python 3中)

import pandas as pd
x = pd.DataFrame({"id": [1, 2,3], "value1": [5,5,5]})
y = pd.DataFrame({"id": [1], "value2": [10]})

z1 = x.join(y, on = "id")
z2 = x.join(y, on = "id", lsuffix = "_left", rsuffix = "_right")
z3 = x.join(y, lsuffix = "_left", rsuffix = "_right")

第一个连接失败,ValueError,第二个连接不会中断但y不匹配,只有第三个连接产生预期结果,即y的行最高为x

join的文档说

  

on:name,tuple / names of list或array-like   调用者中要加入其他索引的列或索引级别名称,   否则加入index-on-index。如果给出多个值,则为另一个DataFrame   必须有一个MultiIndex。如果数组尚未传递,则可以将数组作为连接键传递   包含在调用DataFrame中。就像Excel VLOOKUP操作一样。

这是(即z2发生了什么)一个错误,还是以某种方式有意义?

1 个答案:

答案 0 :(得分:2)

df.join(...)通常用于将df的索引与另一个DataFrame的索引连接。

df.join(..., on='id')id df列加入另一个DataFrame的索引。 Per the docs(我的重点):

  

on:name,tuple / names of list,或array-like

     

调用者中要在其他中加入索引的列或索引级别名称,否则加入index-on-index。如果给定多个值,则另一个DataFrame必须具有MultiIndex。如果数组尚未包含在调用DataFrame中,则可以将数组作为连接键传递。像Excel VLOOKUP操作一样

由于xy看起来像这样:

In [14]: x
Out[14]: 
   id  value1
0   1       5
1   2       5
2   3       5

In [15]: y
Out[15]: 
   id  value2
0   1      10

x.join(y, on='id')尝试将x['id'](值为1, 2, 3)加入y.index(值为0)。由于 x['id']y.index没有共同的值,(默认情况下)左连接会为新y中的值生成NaN,这些列由加入。

z1 = x.join(y, on = "id")加注

ValueError: columns overlap but no suffix specified: Index(['id'], dtype='object')

因为联接生成的y - 列包含已经是id的{​​{1}} x - 列名称。当列名重叠时,您必须指定lsuffixrsuffix或两者都可以消除列名称的歧义。

z2 = x.join(y, on = "id", lsuffix = "_left", rsuffix = "_right")返回

In [12]: z2
Out[12]: 
   id_left  value1  id_right  value2
0        1       5       NaN     NaN
1        2       5       NaN     NaN
2        3       5       NaN     NaN

因为常见的xy - 列(即id列)已被消除歧义。 NaN值归因于x['id']y.index没有共同的值(如上所述)。

z3 = x.join(y, lsuffix = "_left", rsuffix = "_right")生成

In [20]: z3
Out[20]: 
   id_left  value1  id_right  value2
0        1       5       1.0    10.0
1        2       5       NaN     NaN
2        3       5       NaN     NaN

因为现在正在x.indexy.index上执行加入。