2017-05-15 5 views
0

So, noch ein weiteres Problem gruppiert Datenrahmen verwenden, die ich so verwirrt bin immer über ...Managing Multiindex Dataframe-Objekte

ich eine Aggregations Wörterbuch definiert als:

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

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

Und jetzt habe ich zwei gruppierten

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

Joining diese:

Datenrahmen, die ich unter Verwendung der oben aggregiert, dann verbunden
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 

Nun, wenn ich Index und Spalten nenne ich hat:

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]]) 

So sieht es so aus, als ob ich ein regelmäßiges Datenframe-Objekt mit dem Index a,b,c habe aber jede Spalte ist ein Multiindex-Objekt. Ist das eine korrekte Interpretation?

  • Wie schneide ich und nenne das? Angenommen, ich möchte nur A_top_10, A_low_10 für alle a,b,c haben?
  • Nur A_top_10, B_top_10 für a und c?

Ich bin ziemlich verwirrt, so würde jede allgemeine Hilfe toll sein!

Antwort

1

Need slicers, aber zuerst sortieren Spalten von sort_index sonst Fehler:

UnsortedIndexError: 'MultiIndex Slicing requires the index to be fully 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 

Und:

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 

EDIT:

So, it looks as though I have a regular DataFrame-object with index a,b,c but each column is a MultiIndex-object. Is this a correct interpretation?

Ich denke, ganz in der Nähe, besser ist sage ich habe MultiIndex in columns.