2013-03-27 132 views
6

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

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 

合并之前,df1id索引。合并操作之后,合并数据框只有默认数字索引,并且id字段已被删除。我该如何做这种合并操作,但保留最左边数据框的索引?

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

编辑:我可以作为一个黑客做:df1.reset_index()但合并,然后再设置索引,但我不希望如果可能的话,好像合并不应该删除索引。谢谢。

+0

您可以尝试通过名称而不是id对'df1'和'df2'进行索引,然后使用'join'而不是'merge'如下所示:'df1.join(df2)'将保留索引。 – bdiamante 2013-03-27 14:45:06

+0

这是不可能的,因为'name'在'df1'中不是唯一的 – user248237dfsf 2013-03-27 14:50:15

+0

为什么你不合并后的set_index? – user1827356 2013-03-27 15:00:00

回答

3

您已经指出在合并之前执行了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的指数,我们从它的“名称”栏中所,靠在DF1“名称”栏中。

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