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


我开始用这样的字典:

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

当转换为DataFrame时,将列标题(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创建的一些选项吗?或者它应该通过列表理解发生,这对我来说效率低下。


1231
2017-11-22 19:31


起源



答案:


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

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

您还可以创建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

注意 values() 和 keys() 是 总是以相同的顺序所以不用担心。


14
2017-11-22 19:42



只传递好的技巧 d.values() 作为论点!我试图找出一些东西,以便在传递后访问后排序索引 d,但这样你完全不需要它。 - DSM
使用Python 3.6和pandas 0.23.1 d.values() 是否是创建数据框的可接受数据类型。如果你施展 d.values 它列出了一个修复问题的清单。 pd.DataFrame(list(d.values()), index=pd.MultiIndex.from_tuples(d.keys(), names=['id', 'act_type'])) 应该做的伎俩 - kindjacket


答案:


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

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

您还可以创建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

注意 values() 和 keys() 是 总是以相同的顺序所以不用担心。


14
2017-11-22 19:42



只传递好的技巧 d.values() 作为论点!我试图找出一些东西,以便在传递后访问后排序索引 d,但这样你完全不需要它。 - DSM
使用Python 3.6和pandas 0.23.1 d.values() 是否是创建数据框的可接受数据类型。如果你施展 d.values 它列出了一个修复问题的清单。 pd.DataFrame(list(d.values()), index=pd.MultiIndex.from_tuples(d.keys(), names=['id', 'act_type'])) 应该做的伎俩 - kindjacket