从词典创建多索引/分层数据框架

时间:2014-02-26 00:24:10

标签: python pandas

说我有以下词典:

multilevel_indices = {'foo': ['A', 'B', 'C'], 'bar': ['X', 'Y'], 'baz': []}    
column_data_1      = {'foo': [2, 4, 5],       'bar': [2, 3],    'baz': []}

如何使用这些词典创建多索引DataFrame?

应该是这样的:

index_1  index_2     column_data_1
foo      A           2
         B           4
         C           5
bar      X           2
         Y           3
baz      np.NaN      np.NaN 

注意:

如果Pandas不支持NaN索引,我们可以删除上面词典中的空条目。

理想情况下,我希望DataFrame以某种方式捕获这些条目在可能的情况下丢失的事实。但是,最重要的是能够使用multilevel_indices中的索引来索引数据框。

2 个答案:

答案 0 :(得分:2)

使用concat

multilevel_indices = {'foo': ['A', 'B', 'C'], 'bar': ['X', 'Y'], 'baz': []}    
column_data_1      = {'foo': [2, 4, 5],       'bar': [2, 3], 'baz': []}

pd.concat([pd.Series(column_data_1[k], index=multilevel_indices[k]) for k in multilevel_indices],
          keys=multilevel_indices.keys())

结果:

foo  A    2
     B    4
     C    5
bar  X    2
     Y    3
dtype: float64

另外,正如@CT朱提到的那样,在baz的定义中,如果您将[]更改为[None],则可以跟踪这些条目:

baz  NaN    None
foo  A         2
     B         4
     C         5
bar  X         2
     Y         3
dtype: object

答案 1 :(得分:1)

您拥有的原始数据集可能不会产生nan索引,但会稍微更改一下。

In [137]:

multilevel_indices = {'foo': ['A', 'B', 'C'], 'bar': ['X', 'Y'], 'baz': [None]}    
column_data_1      = {'foo': [2, 4, 5],       'bar': [2, 3], 'baz': [None]}
mindex=pd.MultiIndex(levels=[multilevel_indices.keys(),list(chain(*multilevel_indices.values()))],
                     labels=[list(chain(*[[i]*len(v[1]) for i, v in enumerate(multilevel_indices.items())])),
                             range(sum(map(len, multilevel_indices.values())))],
                     names=['index_1',  'index_2'])
print pd.DataFrame(list(chain(*column_data_1.values())), index=mindex, columns=['column_data_1'])


                 column_data_1
index_1 index_2               
baz     NaN                NaN
foo     A                    2
        B                    4
        C                    5
bar     X                    2
        Y                    3

[6 rows x 1 columns]