在Pandas Dataframe中将元组转换为多个索引

Twa*_*ain 12 python pandas

我开始用这样的字典:

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

当转换为DataFrame时,将列标题(id,activitytype)作为列标题放入:

df = DataFrame(dict).transpose()

                        bar__sum  foo__sum
(100000550, ActivityA)        14        12
(100001799, ActivityB)         7         3
Run Code Online (Sandbox Code Playgroud)

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

                        bar__sum  foo__sum
id        act_type
100000550 ActivityA        14        12
100001799 ActivityB         7         3
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?我缺少DataFrame创建的一些选项吗?或者它应该通过列表理解发生,这对我来说效率低下.

Rom*_*kar 14

如果要转换数据帧的索引:

>>> 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
Run Code Online (Sandbox Code Playgroud)

你也可以直接从字典创建DataFrame (d是你的dict,不要调用你的变量,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
Run Code Online (Sandbox Code Playgroud)

请注意,values()keys()总是以相同的顺序,所以没有关于后顾之忧.