2017-06-23 180 views
1

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

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)的指标已被取代(0-6)合并df3。这种行为是否有合理的解释?为什么不是df3(10-16)中的索引?

唯一的解决办法似乎是索引以df1df2.reset_index()复位,执行合并,并在df3df3.set_index('index')重新设置指数,这也导致:

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

是否有如何获得这个结果,而不需要重置和重新设置索引?

回答

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 
+2

可能遵循的'drop_duplicates()'' –

+1

concat'结合'drop_duplicates()'完成这项工作。但我仍然想知道为什么merge()在我的例子中表现得像这样。我会再等一会儿,看看有没有人可以解释它和/或找到一个干净的方法与'合并'工作,否则我会除了这个作为一个答案 – Bart

+1

@我不能评论为什么合并行为这个方式,但更多信息,你可以查看文档[这里](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html)。相关位:“如果在列上连接列,DataFrame索引将被忽略,否则,如果连接索引或列上的索引或索引,索引将被传递”。 – nslamberth

0

我想我会用

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

对不起,我的例子是有点过于简单,这可能会在这种情况下,简单的工作,但它不会用我的实际数据打交道 – Bart