【问题标题】:Dict of dict of dicts to pandas dataframe - changing multiindex rows to be columns字典的字典到熊猫数据框的字典 - 将多索引行更改为列
【发布时间】:2017-10-04 04:13:09
【问题描述】:

我有一本这样的字典:

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 列部分是数字,第二列部分是所有键与百分比,如果这是有道理的。转置不是我想要的,因为我不想改变整个索引,只改变数字/百分比部分。我希望它看起来像这样,在将它从我上面写的字典中转换为数据框之后:

          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

对此有何建议?

【问题讨论】:

  • 您能显示所需的输出(并格式化您的代码块)吗?
  • 是的,抱歉,现在已更新以包含该内容。

标签: python pandas dictionary


【解决方案1】:
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

【讨论】:

  • 谢谢你——当我尝试它时,我似乎得到了一个似乎指向“for”的 SyntaxError——关于为什么的任何想法? pandas.concat({k: pandas.DataFrame(v) for k, v in i.items()}).T.swaplevel(0, 1, 1).sort_index(1) ^ SyntaxError: invalid syntax
  • @jagold1 是的,你有一个错字pandas.concat({k: pandas.DataFrame(v) for k, v in my_dict.items()}).T.swaplevel(0, 1, 1).sort_index(1)
  • 对不起——错字在哪里?我指出的“i”与 my_dict 相同。我相信我使用了与您的回复相同的语法,但我使用的是 pandas 而不是 pd,否则这应该工作吗? --- pandas.concat( {k: pandas.DataFrame(v) for k, v in my_dict.items()} ).T.swaplevel(0, 1, 1).sort_index(1)
  • @jagold1 对不起,我以为是错字...这应该可以。你用的是什么版本的熊猫? pandas.__version__
  • 你用的是什么版本的python?旧版 pandas 似乎不太可能出现 SyntaxError。但是,直到 Python 2.7 才引入字典推导式,如果您使用的是早期版本,这将导致 SyntaxError。
猜你喜欢
  • 2017-12-03
  • 2021-07-17
  • 2019-07-18
  • 1970-01-01
  • 2020-12-01
  • 2016-10-17
  • 2017-08-02
  • 2017-02-27
  • 2021-10-26
相关资源
最近更新 更多