Pandas dataframe of dataframes with hierarchical columns

时间:2018-02-03 08:06:16

标签: python pandas dataframe multidimensional-array hierarchical-data

I have a hierarchical dataframe I created in pandas:

import pandas as pd
import numpy as np
col_index = pd.MultiIndex.from_product([[0,1], ['a', 'b', 'c']])
df_outer = pd.DataFrame(index=range(4), columns=col_index)
print(df_outer)

     0              1          
     a    b    c    a    b    c
 0  NaN  NaN  NaN  NaN  NaN  NaN
 1  NaN  NaN  NaN  NaN  NaN  NaN
 2  NaN  NaN  NaN  NaN  NaN  NaN
 3  NaN  NaN  NaN  NaN  NaN  NaN

I'm wondering if it's possible to populate each entry in this data frame with another data frame, for example:

inner_names = ['w', 'x', 'y', 'z']
df_inner = pd.DataFrame(np.random.randn(4,4), index=inner_names, columns=inner_names)

If this is a bad idea, what would be a better way to create some othe easily indexed data structure containing data frames I want to put in the lements of df_outer?

1 个答案:

答案 0 :(得分:1)

It is a bit crazy, because need 3 levels in columns and 2 levels in indices and then assign by selecting with slicers:

np.random.seed(452)

col_index = pd.MultiIndex.from_product([[0,1], ['a', 'b', 'c'], ['w', 'x']])
idx = pd.MultiIndex.from_product([range(2), ['w', 'x']])
df_outer = pd.DataFrame(columns=col_index, index=idx)
print(df_outer)
       0                             1                         
       a         b         c         a         b         c     
       w    x    w    x    w    x    w    x    w    x    w    x
0 w  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
  x  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
1 w  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
  x  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN

inner_names = ['w', 'x']
df_inner = pd.DataFrame(np.random.randn(2,2), index=inner_names, columns=inner_names)
print(df_inner)
          w         x
w -0.182421  0.962712
x -0.118524 -0.784380

idx = pd.IndexSlice
df_outer.loc[idx[0,:], idx[0, 'a', :]]= df_inner.values
print(df_outer)
            0                                  1                         
            a              b         c         a         b         c     
            w         x    w    x    w    x    w    x    w    x    w    x
0 w -0.182421  0.962712  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
  x -0.118524  -0.78438  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
1 w       NaN       NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
  x       NaN       NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN