pandas:意外的连接行为导致NaN

时间:2016-05-25 14:03:21

标签: python pandas

我有两个数据框,我试图加入pandas(版本0.18.1)。

test1 = pd.DataFrame({'id': range(1,6), 'place': ['Kent','Lenawee','Washtenaw','Berrien','Ottawa']})

  id_1      place
0   1       Kent
1   2    Lenawee
2   3   Montreal
3   4    Berrien
4   5     Ottawa


test2 = pd.DataFrame({'id_2': range(6,11), 'id_parent': range(1,6)})

   id_2  id_parent
0     6          1
1     7          2
2     8          3
3     9          4
4    10          5

然而,当我加入这两个表时,最后一行没有正确加入,因为它是一个左连接,导致NaN。

df = test2.join(test1,on='id_parent',how='left')

   id_2  id_parent  id_1      place
0     6          1     2    Lenawee
1     7          2     3   Montreal
2     8          3     4    Berrien
3     9          4     5     Ottawa
4    10          5   NaN        NaN

这对我没有意义 - id_parent和id_1是连接两个表的键,它们都具有相同的值。两列都具有相同的dtype(int64)。这里发生了什么?

2 个答案:

答案 0 :(得分:3)

join主要加入索引,为此使用merge

In [18]:
test2.merge(test1,left_on='id_parent', right_on='id')

Out[18]:
   id_2  id_parent  id      place
0     6          1   1       Kent
1     7          2   2    Lenawee
2     8          3   3  Washtenaw
3     9          4   4    Berrien
4    10          5   5     Ottawa

你得到NaN,因为rhs将使用rhs索引而05没有条目,所以你得到NaN

答案 1 :(得分:1)

这里我引用pandas的文档:' join接受一个可选的on参数,该参数可以是一列或多个列名,它指定传递的DataFrame将在DataFrame中的该列上对齐。 "

因此,在您的情况下,您将匹配test1上id_parent的test2索引。