嵌套字典转换为pandas数据框

3
我的数据看起来像这样:

{ 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是列。

编辑:

数据存在问题,我认为这就是给定解决方案无法正常工作的原因。在一些情况下,内部数组中有三个 None 而不是三个字典。就像这样:

outer_key3:[None,None,None]


请提供代码以展示您目前为止所尝试的内容。 - Abhisek Roy
@SembeiNorimaki 不,这完全不同。那是关于相反方向的转换。 - ba_ul
2个回答

5
这是一种方法:
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 is actually in place of the whole dictionary (the inner ones) like this: 'O3' : [ None, None, None ] This leads to the error: AttributeError: 'NoneType' object has no attribute 'items' - ba_ul

1

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
@ba_ul 如果数据框中显示为nan,如果您想要删除它,请使用dropna。 - BENY

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