2013-01-03 15 views
12

私は2つのデータフレームを持っています。 DF1は、マルチインデックスが作成されます。パンダのマルチインデックスとシングルインデックスのデータフレームのマージ

   value 
first second  
a  x   0.471780 
     y   0.774908 
     z   0.563634 
b  x   -0.353756 
     y   0.368062 
     z   -1.721840 

とDF2:私はこの場合、「最初の」のインデックスで、唯一のマルチインデックスの持つ2つのデータフレームをマージすることができますどのように

 value 
first 
a  10 
b  20 

?所望の出力は次のようになります。

   value1  value2 
first second  
a  x   0.471780 10 
     y   0.774908 10 
     z   0.563634 10 
b  x   -0.353756 20 
     y   0.368062 20 
     z   -1.721840 20 

答えて

9

あなたはget_level_values使用することができます

firsts = df1.index.get_level_values('first') 
df1['value2'] = df2.ix[firsts].values 

注:ほとんど(DF1除くマルチインデックスである)、ここでjoin ...そうがあるかもしれませんが行っているがこれを説明するうえでのより良い方法...

(あなたが持っているものに似ている)の例では

df1 = pd.DataFrame([['a', 'x', 0.123], ['a','x', 0.234], 
        ['a', 'y', 0.451], ['b', 'x', 0.453]], 
        columns=['first', 'second', 'value1'] 
        ).set_index(['first', 'second']) 
df2 = pd.DataFrame([['a', 10],['b', 20]], 
        columns=['first', 'value']).set_index(['first']) 

firsts = df1.index.get_level_values('first') 
df1['value2'] = df2.ix[firsts].values 

In [5]: df1 
Out[5]: 
       value1 value2 
first second     
a  x  0.123  10 
     x  0.234  10 
     y  0.451  10 
b  x  0.453  20 
+0

あなたは*ほぼ*このようにマージすることができます: '' df1.merge(DF2、left_on = df1.index.get_level_values)( '最初の'、right_on = df2.index.get_level_values( '最初')) –

2

.ix構文は、インデックスの再作成するための強力なショートカットですが、この場合には、あなたが実際に任意の組み合わせの行/列のインデックスの再作成を行っていないため、これをその後

df1 = pd.DataFrame([['a', 'x', 0.123], ['a','x', 0.234], 
        ['a', 'y', 0.451], ['b', 'x', 0.453]], 
        columns=['first', 'second', 'value1'] 
        ).set_index(['first', 'second']) 
df2 = pd.DataFrame([['a', 10],['b', 20]], 
        columns=['first', 'value']).set_index(['first']) 

:ヘイデンから

準備:ちょうど使ってインデックスの再作成して(私の謙虚な味蕾のために)より多くのエレガントなビットを行うことができますこれはiPythonで次のようになります。

In [4]: df1 
Out[4]: 
       value1 
first second   
a  x  0.123 
     x  0.234 
     y  0.451 
b  x  0.453 

In [5]: df2 
Out[5]: 
     value 
first  
a   10 
b   20 

In [7]: df2.reindex(df1.index, level=0) 
Out[7]: 
       value 
first second  
a  x   10 
     x   10 
     y   10 
b  x   20 

In [8]: df1['value2'] = df2.reindex(df1.index, level=0) 

In [9]: df1 
Out[9]: 
       value1 value2 
first second     
a  x  0.123  10 
     x  0.234  10 
     y  0.451  10 
b  x  0.453  20 

あなたはREINDEXメソッドで使用する必要がどのようなレベルのためmnemotechnic: それはあなたがすでに大きなインデックスでカバーレベルのために述べています。 この場合、df2にはすでにレベル0のdf1.indexが含まれています。

4

the documentationによれば、パンダ0.14以降は、単一インデックスとマルチインデックスのデータフレームに参加できます。共通インデックス名と一致します。面白いことに、'left''right'(これはバグかもしれません)のために逆転されているようですが、how引数は'inner''outer'で期待通りに機能します。

df1 = pd.DataFrame([['a', 'x', 0.471780], ['a','y', 0.774908], ['a', 'z', 0.563634], 
        ['b', 'x', -0.353756], ['b', 'y', 0.368062], ['b', 'z', -1.721840], 
        ['c', 'x', 1], ['c', 'y', 2], ['c', 'z', 3], 
        ], 
        columns=['first', 'second', 'value1'] 
        ).set_index(['first', 'second']) 
df2 = pd.DataFrame([['a', 10], ['b', 20]], 
        columns=['first', 'value2']).set_index(['first']) 

print(df1.join(df2, how='inner')) 
       value1 value2 
first second     
a  x  0.471780  10 
     y  0.774908  10 
     z  0.563634  10 
b  x  -0.353756  20 
     y  0.368062  20 
     z  -1.721840  20 
関連する問題