管理MultiIndex Dataframe对象

时间:2017-05-15 07:59:45

标签: pandas dataframe multi-index

所以,使用分组DataFrame的另一个问题是我对...感到困惑......

我已将聚合字典定义为:

aggregations_level_1 = {
       'A': {
           'mean': 'mean',
        }, 

       'B': {
           'mean': 'mean',
        },  
    }

现在我有两个分组的DataFrame,我已经使用上面的聚合,然后加入:

grouped_top = 
     df1.groupby(['group_lvl']).agg(aggregations_level_1)
grouped_bottom = 
     df2.groupby(['group_lvl']).agg(aggregations_level_1)

加入这些:

df3 = grouped_top.join(grouped_bottom, how='left', lsuffix='_top_10', 
rsuffix='_low_10')

                      A_top_10        A_low_10     B_top_10        B_low_10
                      mean            mean         mean            mean
group_lvl                                      
    a                 3.711413    14.515901        3.711413        14.515901
    b                 4.024877    14.442106        3.694689        14.209040
    c                 3.694689    14.209040        4.024877        14.442106

现在,如果我调用索引和列:

print df3.index
    >> Index([u'a', u'b', u'c'], dtype='object', name=u'group_lvl')

print df3.columns
    >> MultiIndex(levels=[[u'A_top_10', u'A_low_10', u'B_top_10', u'B_low_10'], [u'mean']],
       labels=[[0, 1, 2, 3], [0, 0, 0, 0]])

因此,看起来我有一个索引为a,b,c的常规DataFrame对象,但每列都是一个MultiIndex对象。这是正确的解释吗?

  • 如何切片并调用此方法?说我希望所有A_top_10, A_low_10只有a,b,c
  • A_top_10, B_top_10a只有c

我很困惑所以任何整体帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

需要slicers,但首先按sort_index排序列,否则错误:

  

UnsortedIndexError:' MultiIndex Slicing要求索引完全是lexsorted tuple len(1),lexsort depth(0)'

df = df.sort_index(axis=1)

idx = pd.IndexSlice
df1 = df.loc[:, idx[['A_low_10', 'A_top_10'], :]]
print (df1)
            A_low_10  A_top_10
                mean      mean
group_lvl                     
a          14.515901  3.711413
b          14.442106  4.024877
c          14.209040  3.694689

idx = pd.IndexSlice
df2 = df.loc[['a','c'], idx[['A_top_10', 'B_top_10'], :]]
print (df2)
           A_top_10  B_top_10
               mean      mean
group_lvl                    
a          3.711413  3.711413
c          3.694689  4.024877

编辑:

  

因此,看起来我有一个带索引a,b,c的常规DataFrame对象,但每列都是一个MultiIndex对象。这是正确的解释吗?

我认为非常接近,更好的是我在MultiIndex中有columns