2013-11-22 271 views
9

我开始有了这样的字典元组转换到多个指标:在熊猫数据帧

dict = {(100000550L, u'ActivityA'): {'bar__sum': 14.0, 'foo__sum': 12.0}, 
     (100001799L, u'ActivityB'): {'bar__sum': 7.0, 'foo__sum': 3.0}} 

,当转换成数据帧,使作为列标题的(ID,activitytype)的元组:

df = DataFrame(dict).transpose() 

         bar__sum foo__sum 
(100000550, ActivityA)  14  12 
(100001799, ActivityB)   7   3 

如何将索引中的元组转换为MultiIndex?即,使得最终的结果看起来是这样的,而不是:

     bar__sum foo__sum 
id  act_type 
100000550 ActivityA  14  12 
100001799 ActivityB   7   3 

什么是做到这一点的最好方法是什么? DataFrame创建有一些选项,我错过了吗?还是应该通过列表理解来实现,这对我来说感觉效率很低。

回答

12

如果你想转换索引你的数据帧的

>>> df.index = pd.MultiIndex.from_tuples(df.index) 
>>> df 
        bar__sum foo__sum 
100000550 ActivityA  14  12 
100001799 ActivityB   7   3 

>>> df.index.names = ['id', 'act_type'] 
>>> df 
        bar__sum foo__sum 
id  act_type      
100000550 ActivityA  14  12 
100001799 ActivityB   7   3 

您也可以直接从字典创建数据框d是你的快译通,不要叫你的变量dict,因为它会影标准的Python字典):

>>> pd.DataFrame(d.values(), index=pd.MultiIndex.from_tuples(d.keys(), names=['id', 'act_type'])) 
        bar__sum foo__sum 
id  act_type      
100001799 ActivityB   7   3 
100000550 ActivityA  14  12 

注意values()keys()always in the same order,所以不用担心。

+1

不错的技巧只传递'd.values()'作为参数!我试图找出在通过'd'之后访问后排序索引的东西,但这样你根本不需要它。 – DSM