pandas在Python中删除合并时的索引索引?

时间:2013-03-27 14:31:41

标签: python pandas

我正在使用merge(..., how='left')合并两个数据帧,因为我只想保留与“左”数据帧匹配的条目。问题是合并操作似乎丢弃了我最左边的数据帧的索引,如下所示:

import pandas
df1 = pandas.DataFrame([{"id": 1,
                         "name": "bob"},
                        {"id": 10,
                         "name": "sally"}])
df1 = df1.set_index("id")
df2 = pandas.DataFrame([{"name": "bob",
                         "age": 10},
                        {"name": "sally",
                         "age": 11}])

print "df1 premerge: "
print df1
df1 = df1.merge(df2, on=["name"],
                how="left")
print "merged: "
print df1
# This is not "id"
print df1.index
# And there's no "id" field
assert ("id" in df1.columns) == False

在合并之前,df1已被id编入索引。合并操作之后,只有合并数据帧的默认数字索引,并且id字段被删除。如何进行这种合并操作但保留最左边数据帧的索引?

澄清一下:我希望将df2的所有列添加到df1中具有匹配id值的每个条目。如果df2中的条目的id值不在df1中,则不应将其合并(因此how='left')。

编辑:我可以像黑客一样:df1.reset_index()但是合并然后再次设置索引,但我不愿意,如果可能,似乎合并不应该删除索引。感谢。

1 个答案:

答案 0 :(得分:4)

你已经指出在合并之前做一个reset_index,之后做一个set_index,这有效。我知道在合并中保留索引的唯一方法是合并涉及至少一个被合并的数据帧的索引。所以在这里,你可以这样做:

In [403]: df2 = df2.set_index('name')

In [404]: df1.merge(df2, left_on='name', right_index=True)
Out[404]: 
     name  age
id            
1     bob   10
10  sally   11

将df2的索引(我们从其'name'列中取出)与df1上的'name'列合并。

这是有道理的,因为否则结果数据帧的索引是不明确的,因为它可能来自任一数据帧。