2015-08-20 39 views
0

我目前正在尝试使用Pandas MultiIndex属性。我试图以一种智能的方式基于它的列对现有的DataFrame对象df_original进行分组,并且因此正在考虑MultiIndex。现在DataFrame上的多重索引和大熊猫的总和

print df_original = 

     by_currency by_portfolio A B C 
1  AUD   a    1 2 3 
2  AUD   b    4 5 6 
3  AUD   c    7 8 9 
4  AUD   d    10 11 12 
5  CHF   a    13 14 15 
6  CHF   b    16 17 18 
7  CHF   c    19 20 21 
8  CHF   d    22 23 24 

,我想有一个多指标数据帧的对象,与A, BCby_portfolio作为指标。看上去就像

   CHF  AUD 
A  a  13  1 
     b  16  4 
     c  19  7 
     d  22  10 
B  a  14  2 
     b  17  5 
     c  20  8 
     d  23  11 
C  a  15  3 
     b  18  6 
     c  21  9 
     d  24  12 

我曾试图使所有列在df_original和指数到列表对象的追捧,并从那里创建一个新的数据帧。这似乎有点麻烦,我不知道如何添加实际值。

也许某种groupby更适合此目的?事情是我需要能够将这些数据添加到另一个类似的DataFrame中,因此我需要生成的DataFrame能够在稍后添加到另一个DataFrame中。

感谢

回答

3

您可以使用stackunstack组合:

In [50]: df.set_index(['by_currency', 'by_portfolio']).stack().unstack(0) 
Out[50]: 
by_currency  AUD CHF 
by_portfolio 
a   A 1 13 
      B 2 14 
      C 3 15 
b   A 4 16 
      B 5 17 
      C 6 18 
c   A 7 19 
      B 8 20 
      C 9 21 
d   A 10 22 
      B 11 23 
      C 12 24 

要获得期望的结果,我们只需要交换指标的水平:

In [51]: df2 = df.set_index(['by_currency', 'by_portfolio']).stack().unstack(0) 

In [52]: df2.columns.name = None 

In [53]: df2.index = df2.index.swaplevel(0,1) 

In [55]: df2 = df2.sort_index() 

In [56]: df2 
Out[56]: 
       AUD CHF 
    by_portfolio 
A a    1 13 
    b    4 16 
    c    7 19 
    d    10 22 
B a    2 14 
    b    5 17 
    c    8 20 
    d    11 23 
C a    3 15 
    b    6 18 
    c    9 21 
    d    12 24