2012-08-15 20 views
54

2つをマージして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

これはパンダについてのトップ10の愚かなことになっています... ...なぜインデックスを失うことはこれまで理にかなっていましたか? – Corone

答えて

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

非常に巧妙です。 set_index(a.index)も動作しますが、最初の部分がリセットされる前にインデックス値が失われているため、堅牢性が低下しています。 – DanB

+7

この特定の場合は、a.merge(b、how = "left"これらは同等です。しかし、多くのマージ操作では、結果のフレームは元の「a」フレームと同じ行数ではありません。 reset_indexは、インデックスを通常の列に移動し、マージ後にこの列のset_indexをマージ操作のために重複/削除するときにも注意します。 –

+0

なぜ私のソリューションが故障するのか分かりませんでしたが、私はそれを考えました。 reset_index()とset_index()の解決策は非常に意味があります。ありがとう。 – DanB

1

非pd.merge溶液がある再生することができる例示的なコードに切り替えました。 map

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 

set_indexを使用して、インデックスのためにダミーindex名前を導入しません。

関連する問題