2017-06-23 124 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