我想要做的是在列上连接两个数据帧并保留其中一个的索引(但索引与我是否加入它们无关)。
例如,如果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
答案 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'的原始值。如果需要的话。