pandas 如何将多级dict转换为python Dataframe ?

gkn4icbw  于 2023-05-21  发布在  Python
关注(0)|答案(3)|浏览(233)

我得到输出Web API响应如下。

d = { 'L1': [{'att_1': 10, 'att_2': 'whatever',
                  'att_4': 214, 'att_5': 'YES'}],
  'L2': [{'att_1': 11, 'att_2': 'whatever News',
                  'att_4': 230, 'att_5': 'another'}],
  'L3': [{'att_1': 12, 'att_2': 'whatever says',
                  'att_4': 213, 'att_5': 'YES'}]}

从上面的多级JSON/字典我需要Pandas Dataframe 如下。

att_1    att_2           att_4     att_5
L1    10       whatever        214       YES
L2    11       whatever  News  230       another
L3    12       whatever says   213       YES

我试了一下

for k, v in d.items():
   print(k)
   print(v)

pd.DataFrame.from_dict({k:(v,orient='index') for k, v in d.items()}axis=1)

我得到错误。你能提供解决方案吗?

hi3rlvi2

hi3rlvi21#

在修复了d中的 typos'Lx'而不是Lx)之后,您可以通过以下方式 * 重新排列/修复 * 您的代码:

df = pd.DataFrame.from_dict({k: v[0] for k, v in d.items()}, orient="index")

输出:

print(df)

    att_1          att_2  att_4    att_5
L1     10       whatever    214      YES
L2     11  whatever News    230  another
L3     12  whatever says    213      YES
r6l8ljro

r6l8ljro2#

对于一般解决方案,使用concat在字典理解中创建DataFrames,最后通过DataFrame.droplevel删除MultiIndex的第二级:

df = pd.concat({k: pd.DataFrame(v) for k, v in d.items()}).droplevel(1)
print (df)
    att_1          att_2  att_4    att_5
L1     10       whatever    214      YES
L2     11  whatever News    230  another
L3     12  whatever says    213      YES

如果有一个元素列表,则可以用途:

df = pd.DataFrame.from_dict({k: v[0] for k, v in d.items()}, orient='index')
print (df)
    att_1          att_2  att_4    att_5
L1     10       whatever    214      YES
L2     11  whatever News    230  another
L3     12  whatever says    213      YES
bpzcxfmw

bpzcxfmw3#

你可以这样做:

df = pd.DataFrame.from_records((v[0] for v in d.values()), index=d.keys())

+--+-----+-------------+-----+-------+
|  |att_1|att_2        |att_4|att_5  |
+--+-----+-------------+-----+-------+
|L1|10   |whatever     |214  |YES    |
|L2|11   |whatever News|230  |another|
|L3|12   |whatever says|213  |YES    |
+--+-----+-------------+-----+-------+

相关问题