python - 将嵌套字典列表转换为 pandas DataFrame

标签 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

最佳答案

使用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

关于python - 将嵌套字典列表转换为 pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58503967/

相关文章:

python - 更改链式操作中的所有列名

python - eclipse 中未定义的常量

pandas - 如何使用条件执行 pd.fillna()

python - Pandas 在 2 个给定数字之间进行插值,给定步长并在 groupby 内

python - 在数据框列中将负值裁剪为 0 (Pandas)

python - 根据 groupby 和条件对列求和

python - 有没有一种方法可以在没有 UI 的情况下在浏览器中登录 django Rest api?

python - 子进程无法使用复杂的 Unix 命令

python - 如何确保 Pandas 不会将数字字符串解释为 Pandas 中的数字?

python - 按两列将值映射到 DataFrame 上