【问题标题】:Nested dictionary to pandas DataFrame嵌套字典到熊猫 DataFrame
【发布时间】:2018-08-13 09:11:50
【问题描述】:

我的数据如下所示:

{ outer_key1 : [ {key1: some_value},
                {key2: some_value},
                {key3: some_value} ],
  outer_key2 : [ {key1: some_value},
                {key2: some_value},
                {key3: some_value} ] }

内部数组的长度总是相同的。 key1, key2, key3 也总是相同的。

我想将其转换为 pandas DataFrame,其中 outer_key1、outer_key2、... 是索引,而 key1、key2、key3 是列。

编辑:

数据中存在问题,我认为这是给定解决方案不起作用的原因。在少数情况下,内部数组中有三个Nones,而不是三个字典。像这样:

outer_key3: [ None, None, None ]

【问题讨论】:

标签: python pandas dictionary dataframe


【解决方案1】:

这是一种方法:

d = { 'O1' : [ {'K1': 1},
               {'K2': 2},
               {'K3': 3} ],
      'O2' : [ {'K1': 4},
               {'K2': 5},
               {'K3': 6} ] }

d = {k: { k: v for d in L for k, v in d.items() } for k, L in d.items()}

df = pd.DataFrame.from_dict(d, orient='index')

#     K1  K2  K3
# O1   1   2   3
# O2   4   5   6

替代解决方案:

df = pd.DataFrame(d).T

None数据比较麻烦的方法:

d = { 'O1' : [ {'K1': 1},
               {'K2': 2},
               {'K3': 3} ],
      'O2' : [ {'K1': 4},
               {'K2': 5},
               {'K3': 6} ],
      'O3' : [ {'K1': None},
               {'K2': None},
               {'K3': None} ] }

d = {k: v if isinstance(v[0], dict) else [{k: None} for k in ('K1', 'K2','K3')] for k, v in d.items()}
d = {k: { k: v for d in L for k, v in d.items() } for k, L in d.items()}

df = pd.DataFrame.from_dict(d, orient='index')

#      K1   K2   K3
# O1  1.0  2.0  3.0
# O2  4.0  5.0  6.0
# O3  NaN  NaN  NaN

【讨论】:

  • None 实际上代替了整个字典(内部字典),如下所示:'O3' : [ None, None, None ] 这会导致错误:AttributeError: 'NoneType' object has no attribute 'items'
【解决方案2】:

来自 Jpp 的数据

pd.Series(d).apply(lambda x  : pd.Series({ k: v for y in x for k, v in y.items() }))
Out[1166]: 
    K1  K2  K3
O1   1   2   3
O2   4   5   6

更新

pd.Series(d).apply(lambda x  : pd.Series({ k: v for y in x for k, v in y.items() }))
Out[1179]: 
     K1   K2   K3
O1  1.0  2.0  3.0
O2  4.0  5.0  6.0
O3  NaN  NaN  NaN

【讨论】:

  • 我添加了一些新信息。请问None这个问题怎么处理?
  • @ba_ul 它将在数据框中显示 nan,如果你想删除它,使用 dropna
猜你喜欢
  • 2019-03-12
  • 1970-01-01
  • 2023-03-23
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2019-07-24
相关资源
最近更新 更多