2012-08-15 40 views
54

我想合併兩個DataFrames,並將第一幀的索引作爲合併數據集的索引。但是,當我進行合併時,生成的DataFrame具有整數索引。我怎樣才能指定我想保留左數據框的索引?如何在使用熊貓合併時保持索引

In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3}, 
          'to_merge_on': {'a': 1, 'b': 3, 'c': 4}}) 

In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3}, 
          'to_merge_on': {0: 1, 1: 3, 2: 5}}) 

In [6]: a 
Out[6]: 
    col1 to_merge_on 
a  1   1 
b  2   3 
c  3   4 

In [7]: b 
Out[7]: 
    col2 to_merge_on 
0  1   1 
1  2   3 
2  3   5 

In [8]: a.merge(b, how='left') 
Out[8]: 
    col1 to_merge_on col2 
0  1   1 1.0 
1  2   3 2.0 
2  3   4 NaN 

In [9]: _.index 
Out[9]: Int64Index([0, 1, 2], dtype='int64') 

編輯:切換到例如碼可以很容易地再現

+29

這必須是關於熊貓的十大最愚蠢的事情......爲什麼失去索引有意義? – Corone 2015-08-03 15:51:48

回答

69
In [5]: a.reset_index().merge(b, how="left").set_index('index') 
Out[5]: 
     col1 to_merge_on col2 
index 
a   1   1  1 
b   2   3  2 
c   3   4 NaN 
+1

非常聰明。 a.merge(b,how =「left」).set_index(a.index)也可以工作,但它看起來不太健壯(因爲它的第一部分在重置它們之前失去了索引值)。 – DanB 2012-08-16 18:01:31

+7

對於這個特定的情況下,這些是等同的。但是對於許多合併操作,結果幀的行數與原來的「a」幀不同。 reset_index將索引移動到常規列,並在合併後將此索引列中的set_index移動到a行由於合併操作而被複制/刪除時。 – 2012-08-16 19:35:06

+0

我不知道爲什麼我的解決方案會崩潰,但我想它會。 reset_index()和set_index()解決方案很有意義。謝謝。 – DanB 2012-08-17 04:33:29

1

有一個非pd.merge溶液。使用mapset_index

In [1744]: a.assign(col2=a['to_merge_on'].map(b.set_index('to_merge_on')['col2'])) 
Out[1744]: 
    col1 to_merge_on col2 
a  1   1 1.0 
b  2   3 2.0 
c  3   4 NaN 

而且,不爲索引引入了虛擬index名。