字典嵌套字典转换为pandas数据框 - 将多级索引行变为列

4

我有一个这样的字典:

my_dict = {'Key': {'Service': {'Number': 61, 'Percent': 2.54 }, 'Service2': {'Number': 42, 'Percent': 2.2 } }, 'Key2': {'Service3': {'Number': 8, 'Percent': 2.74}, 'Service2': {'Number': 52, 'Percent': 2.5 } }}

我正在尝试将其转换为pandas数据框。我已经成功实现了以下解决方案:

pandas.concat(map(pandas.DataFrame, my_dict.itervalues()), keys=my_dict.keys()).stack().unstack(0)

然而,我的问题在于我得到了一个表格,其中行索引是服务和数字/百分比的多重索引。相反,我希望索引只是出现的不同服务(不是多重索引),并且希望列是键,就像它们现在一样,但第1列部分是数字,第2列部分是所有具有百分比的键,如果这有意义的话。转置不是我想要的,因为我不想改变整个索引,只是数字/百分比部分。我希望在从上面的字典转换为数据框后,它看起来像这样:
          Number         Percent
          Key    Key2    Key     Key2
Service   61     NaN     2.54    NaN
Service2  42     52      2.2     2.5
Service3  NaN    8       NaN     2.74

有关此问题,有什么建议吗?

2
你能展示期望的输出结果(并格式化你的代码块)吗? - IanS
是的,抱歉,现在已更新以包括该内容。 - Jan G-M
1个回答

9
pd.concat({k: pd.DataFrame(v) for k, v in my_dict.items()})

              Service  Service2  Service3
Key  Number     61.00      42.0       NaN
     Percent     2.54       2.2       NaN
Key2 Number       NaN      52.0      8.00
     Percent      NaN       2.5      2.74

pd.concat({k: pd.DataFrame(v) for k, v in my_dict.items()}, axis=1).stack(0).T

         Number       Percent      
            Key  Key2     Key  Key2
Service    61.0   NaN    2.54   NaN
Service2   42.0  52.0    2.20  2.50
Service3    NaN   8.0     NaN  2.74

这不依赖于推导式

pd.DataFrame(my_dict).stack().apply(pd.Series).unstack()
# pandas.DataFrame(i).stack().apply(pandas.Series).unstack()

         Number       Percent      
            Key  Key2     Key  Key2
Service    61.0   NaN    2.54   NaN
Service2   42.0  52.0    2.20  2.50
Service3    NaN   8.0     NaN  2.74

谢谢您--我似乎遇到了一个SyntaxError,它似乎指向了“for”- 有任何关于这个问题的想法吗?pandas.concat({k: pandas.DataFrame(v) for k, v in i.items()}).T.swaplevel(0, 1, 1).sort_index(1) ^ SyntaxError: invalid syntax - Jan G-M
@jagold1 对不起,我以为那是打字错误... 这个应该可以。你正在使用哪个版本的pandas? pandas.__version__ - piRSquared
@piRSquared 我正在使用0.10.1,也许这就是原因?还有其他可能仍然适用于此版本的方法吗? - Jan G-M
@jagold1 噢,那是一个旧版本。 - piRSquared
3
你在使用哪个版本的Python?旧版的pandas不太可能引起SyntaxError。然而,如果你使用的是早期版本,那么字典推导式直到Python 2.7才被引入,会导致SyntaxError。请确认你使用的Python版本。 - root
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接