将嵌套字典列表转换为Pandas DataFrame

时间:2019-10-22 12:08:16

标签: python pandas

我有一个转换为列表的数据。如何将其转换为DataFrame,以使该列表中的每一行成为DataFrame中的一列?

[{'date': '2019-01-01',
  'stats': [{'metrics': {'comp_1': 149, 
                         'comp_2': 276}}]},
 {'date': '2019-01-02',
  'stats': [{'metrics': {'comp_1': 232, 
                         'comp_2': 842}}]}]

我尝试做pd.DataFrame(c),其中c是保存列表的变量,但是我看到每个日期的所有成分都存储在一行中

预期输出:

date, comp_1, comp_2
2019-01-01,149,276
2019-01-02,232,842

1 个答案:

答案 0 :(得分:4)

首先使用json.json_normalize

a = [{'date': '2019-01-01',
'stats': [{'metrics': {'comp_1': 149,
 'comp_2': 276}}]},
{'date': '2019-01-02',
'stats': [{'metrics': {'comp_1': 232,
 'comp_2': 842}}]}]

from pandas.io.json import json_normalize

df = json_normalize(a,'stats', ['date'])
print (df)
   metrics.comp_1  metrics.comp_2        date
0             149             276  2019-01-01
1             232             842  2019-01-02

最后将列名称转换为列表,并按子集重新排序:

df = df[df.columns[-1:].tolist() + df.columns[:-1].tolist()]
print (df)
         date  metrics.comp_1  metrics.comp_2
0  2019-01-01             149             276
1  2019-01-02             232             842

编辑:

带循环的解决方案:

out = []
for x in a:
    for k, v in x.items():
        for z in v:
            if isinstance(z, dict):
                d = z['metrics']
                d['year'] = x['date']
                out.append(d)

df = pd.DataFrame(out)   
print (df)
   comp_1  comp_2        year
0     149     276  2019-01-01
1     232     842  2019-01-02