加入pandas表,保留一个索引

时间:2015-09-18 17:24:46

标签: python join pandas

我想要做的是在列上连接两个数据帧并保留其中一个的索引(但索引与我是否加入它们无关)。

例如,如果df1是我希望保留某些时间戳作为其索引的数据框,那么要加入“密钥”列上的df2,我的预期代码将是

df3 = pd.merge(df1, df2, on='key', left_index=True)

我希望df3将df1和df2的所有行都放在df3[key] == df1[key] == df2[key]df3[key].index == df1[key].index中。

但事实并非如此。事实上,您发现df3的索引实际上是df2的索引。 right_index=True反之亦然。

我考虑过提交错误报告,但重读文档会让我相信(虽然完全反直觉)这可能不是错误的行为。

连接两个表的正确方法,保留其中一个索引?

编辑:

我在'key'上进行内部联接。这不是问题。问题是我希望生成的行具有其中一个数据帧的索引。

例如,如果我在两个数据帧中有以下数据集:

df1 = pd.DataFrame(np.arange(4).reshape(2,2))
df2 = pd.DataFrame(np.arange(4).reshape(2,2), columns=[0,2])
df2.index = df2.index.map(lambda x: x + 10)

即,

>>> df1
   0  1
0  0  1
1  2  3
>>> df2
    0  2
10  0  1
11  2  3

我可以运行pd.merge(df1, df2, on=0)(正如预期的那样)产生

>>> pd.merge(df1,df2,on=0)
   0  1  2
0  0  1  1
1  2  3  3

但请注意,df2具有不同的索引。在我的实际数据中,这是我想保留的时间戳数据。它根本不用于加入,但它 需要持久化。我可以只添加一列到df2来保持它,但这不是我想要做的。 :)

我想要做的事情是pd.merge(df1, df2, on=0, right_index=True)和接收:

    0  1  2
10  0  1  1
11  2  3  3

但是,我实际上得到了 相反的

>>> pd.merge(df1,df2,on=0,right_index=True)
   0  1  2
0  0  1  1
1  2  3  3

虽然扭转它们莫名其妙地起作用。

>>> pd.merge(df1,df2,on=0,left_index=True)
    0  1  2
10  0  1  1
11  2  3  3

1 个答案:

答案 0 :(得分:1)

我认为您所寻找的内容类似于SQL中的完全外部联接,在这种情况下,我认为以下内容可行:

df3 = pd.merge(df1, df2, on='key', how='outer')

至于只保留一个索引,在这种情况下应该自动完成,因为外连接保留了所有键。

使用您的示例:

In [4]: df1['key'] = df1.index

In [5]: df2['key'] = df2.index

In [6]: df3 = pd.merge(df1, df2, on='key', how='outer')

In [7]: df3
Out[7]:
   0_x   1  key  0_y   2
0    0   1    0  NaN NaN
1    2   3    1  NaN NaN
2  NaN NaN   10    0   1
3  NaN NaN   11    2   3

因此,在这种情况下,会创建一个新索引,但可以重新分配来自' key'的原始值。如果需要的话。