我合并了两个数据帧,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
Run Code Online (Sandbox Code Playgroud)
在合并之前,df1被索引了id.合并操作之后,只有合并数据帧的默认数字索引,并且该id字段已被删除.如何进行这种合并操作但保留最左边数据帧的索引?
澄清一下:我希望将所有列df2添加到df1具有匹配id值的每个条目中.如果条目df2的id值不在df1,则不应该合并(因此how='left').
编辑:我可以作为黑客做:df1.reset_index()但合并然后再次设置索引,但我不希望如果可能,似乎合并不应该删除索引.谢谢.
您已经指出在合并之前执行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
Run Code Online (Sandbox Code Playgroud)
将 df2 的索引(我们从其“名称”列中获取)与 df1 上的“名称”列合并。
这是有一定道理的,因为否则结果数据帧的索引是不明确的,因为它可能来自任一数据帧。