2013-01-03 163 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