【问题标题】:Pandas DataFrame merge resets indexPandas DataFrame 合并重置索引
【发布时间】:2017-11-27 03:23:59
【问题描述】:

我正在尝试合并两个 Pandas DataFrames,其中(可能)有一些重复的记录。合并按预期工作,但不幸的是,它似乎重置了索引。考虑这个简单的例子:

import pandas as pd
import numpy as np

index = np.arange(10,15)
data  = np.arange(10,15)
df1 = pd.DataFrame({'data':data}, index=index)

index = np.arange(12,17)
data  = np.arange(12,17)
df2 = pd.DataFrame({'data':data}, index=index)

df3 = df1.merge(df2, how='outer')

这会导致:

# df1:       df2:         df3: 
# ------     # ------     # ------
    data         data         data
10    10     12    12     0    10
11    11     13    13     1    11
12    12     14    14     2    12
13    13     15    15     3    13
14    14     16    16     4    14
                          5    15 
                          6    16

所以df1 (10-14) 和df2 (12-16) 中的索引已被合并df3 中的(0-6) 替换。这种行为有合理的解释吗?为什么df3 (10-16) 中没有索引?

唯一的解决方法似乎是用.reset_index() 重置df1 和df2 中的索引,进行合并,然后用df3 再次设置索引df3.set_index('index'),这确实会导致:

In [97]: df3.index
Out[97]: Int64Index([10, 11, 12, 13, 14, 15, 16], dtype='int64', name='index')

有没有办法在不重置和重新设置索引的情况下得到这个结果?

【问题讨论】:

    标签: python python-3.x pandas merge


    【解决方案1】:

    您正在寻找concat 而不是merge。检查以下内容:

    In [13]: pd.concat([df1, df2], axis=0)
    Out[13]: 
        data
    10    10
    11    11
    12    12
    13    13
    14    14
    12    12
    13    13
    14    14
    15    15
    16    16
    

    【讨论】:

    • 后面可能是drop_duplicates()
    • concat 与 drop_duplicates() 结合使用即可。但我仍然想知道为什么merge() 在我的示例中表现得像这样。我会再等一会儿,看看是否有人可以解释它和/或找到一个有效的merge 的干净方法,否则我将把这个作为答案
    • @Bart 我无法评论为什么合并会以这种方式运行,但有关更多信息,您可以查看文档here。相关位:“如果在列上连接列,DataFrame 索引将被忽略。否则,如果在索引或列上的索引上连接索引,则索引将被传递”。
    • 我读过,但没有发现文档很清楚。无论如何,我现在正在使用您的解决方案,它运行良好,似乎是合并数据框的最短方式,所以我会接受它。
    【解决方案2】:

    我想我会用

     df3.index = df3['data'].values
    

    【讨论】:

    • 对不起,我的例子有点太简单了,这可能适用于这个简化的情况,但它不适用于我的真实数据
    猜你喜欢
    • 2013-09-08
    • 2020-08-22
    • 2016-11-22
    • 2013-11-19
    • 2013-09-23
    • 1970-01-01
    • 2017-11-01
    相关资源
    最近更新 更多