如何将多索引数据框与另一个多索引数据框连接?

时间:2015-09-23 20:30:24

标签: python pandas

这是从以下主题更进一步: How to do join of multiindex dataframe with a single index dataframe?

df1的多指数是df2的次级指数。

In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: import itertools
In [4]: inner = ('a','b')
In [5]: outer = ((10,20), (1,2))
In [6]: cols = ('one','two','three','four')
In [7]: sngl = pd.DataFrame(np.random.randn(2,4), index=inner, columns=cols)
In [8]: index_tups = list(itertools.product(*(outer + (inner,))))
In [9]: index_mult = pd.MultiIndex.from_tuples(index_tups)
In [10]: mult = pd.DataFrame(index=index_mult, columns=cols)
In [11]: sngl
Out[11]: 
        one       two     three      four
a  2.946876 -0.751171  2.306766  0.323146
b  0.192558  0.928031  1.230475 -0.256739

In [12]: mult
Out[12]: 
        one  two three four
10 1 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN
   2 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN
20 1 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN
   2 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN


In [13]: mult.ix[(10,1)] = sngl

In [14]: mult
Out[14]: 
        one  two three four
10 1 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN
   2 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN
20 1 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN
   2 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN

# the new dataframes
sng2=pd.concat([sng1,sng1],keys=['X','Y'])
mult2=pd.concat([mult,mult],keys=['X','Y'])

In [110]:

sng2
Out[110]:
             one     two           three    four
X   a   0.206810    -1.056264   -0.572809   -0.314475
    b   0.514873    -0.941380   0.132694    -0.682903
Y   a   0.206810    -1.056264   -0.572809   -0.314475
    b   0.514873    -0.941380   0.132694    -0.682903

In [121]: mult2
Out[121]:
               one  two three   four
X   10  1   a   NaN NaN NaN NaN
            b   NaN NaN NaN NaN
        2   a   NaN NaN NaN NaN
            b   NaN NaN NaN NaN
    20  1   a   NaN NaN NaN NaN
            b   NaN NaN NaN NaN
        2   a   NaN NaN NaN NaN
            b   NaN NaN NaN NaN
Y   10  1   a   NaN NaN NaN NaN
            b   NaN NaN NaN NaN
        2   a   NaN NaN NaN NaN
            b   NaN NaN NaN NaN
    20  1   a   NaN NaN NaN NaN
            b   NaN NaN NaN NaN
        2   a   NaN NaN NaN NaN
            b   NaN NaN NaN NaN

上面的代码很长,请滚动 sng2的两个多级索引共享mul2的第一和第四个索引。 ('X','a')例如。

@DSM提出了一种使用多索引df2和单索引df1

的解决方案
mult[:] = sngl.loc[mult.index.get_level_values(2)].values

BUt DataFrame.index.get_level_values(2)只能用于一个索引级别。

1 个答案:

答案 0 :(得分:1)

从问题中不清楚数据框共享哪个索引级别。我认为你需要修改设置代码,因为它在sngl的定义中给出了错误。无论如何,假设multsngl共享第一级和第二级,您可以从mult的索引中删除第二级并索引:

mult[:] = sngl.loc[mult.index.droplevel(2)].values

另外,您可以使用pd.MultiIndex.from_product直接从产品构建多索引,而不是使用itertools