【问题标题】:pandas drops index index on merge in Python?pandas 在 Python 中合并时删除索引索引?
【发布时间】:2013-05-28 02:19:05
【问题描述】:

我正在使用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

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

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

编辑:我可以作为一个黑客做:df1.reset_index() 但合并然后再次设置索引,但如果可能的话,我不喜欢这样做,似乎合并不应该放弃指数。谢谢。

【问题讨论】:

  • 您可以尝试按名称而不是 id 索引 df1df2,然后使用 join 而不是 merge,如下所示:df1.join(df2) 这将保留索引。跨度>
  • 这是不可能的,因为namedf1 中不是唯一的
  • 合并后为什么不set_index?
  • 我会,但它会删除我想成为合并后索引的列,即id
  • 我找到了this question,这似乎是一回事。答案基本上就是你所说的黑客攻击。

标签: python pandas


【解决方案1】:

您已经指出在合并之前执行 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 上的“名称”列合并。

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

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2012-11-14
    • 1970-01-01
    • 2020-08-31
    • 2013-09-08
    相关资源
    最近更新 更多