2013-01-03 209 views
12

我有兩個數據幀。 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:

 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 

注意:你是幾乎join這裏(的DF1是多指標時除外)......所以有可能一個整潔的方式來形容這...

在示例中(類似於你有什麼):

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 

爲你在重新索引方法使用哪種層次的記憶術: 它指出了,你已經涵蓋在更大的指數水平。 因此,在這種情況下,df2已經覆蓋了df1.index的0級。

4

根據the documentation,截至pandas 0.14,您可以簡單地加入單索引和多索引數據幀。它將匹配通用索引名稱。 how參數與'inner''outer'一樣按預期工作,但有趣的是,它似乎與'left''right'相反(這可能是一個錯誤?)。

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