将带有列表的JSON dict导入Dataframe [重复]

Posted

技术标签:

【中文标题】将带有列表的JSON dict导入Dataframe [重复]【英文标题】:Import JSON dict with list into Dataframe [duplicate] 【发布时间】:2018-10-18 09:11:57 【问题描述】:

我有一个要转换为 pd.DataFrame 的财务数据字典。

数据如下:

u'candles': [u'complete': True,
   u'mid': u'c': u'1.19228',
    u'h': u'1.19784',
    u'l': u'1.18972',
    u'o': u'1.19581',
   u'time': u'2018-05-06T21:00:00.000000000Z',
   u'volume': 119139,
  u'complete': False,
   u'mid': u'c': u'1.18706',
    u'h': u'1.19388',
    u'l': u'1.18614',
    u'o': u'1.19239',
   u'time': u'2018-05-07T21:00:00.000000000Z',
   u'volume': 83259],
 u'granularity': u'D',
 u'instrument': u'EUR_USD'

这有点棘手,因为我想要一个包含这些字段的数据框:

c h l o time volume
1.19228 1.19784 1.18972 1.19581 2018-05-06T21:00:00.000000000Z  119139
1.18706 1.19388 1.18614 1.19239 2018-05-07T21:00:00.000000000Z  83259

我尝试过各种组合,例如:

pd.DataFrame(dict['candles'])
 pd.DataFrame([dict['candles']])

但是如果不转换字典似乎不可能转换为所需的格式

【问题讨论】:

pd.read_json/ json_normalize 并查看关于“将 JSON 导入 pandas”的所有重复问题。请关闭重复的问题 还有pd.from_dict,但这可能不是你想要的 【参考方案1】:
data = input_data['candles']
df = pd.DataFrame(data=data, columns=['mid', 'time', 'volume'])

现在您将 mid 作为包含嵌套字段的列,而不是您想要的。

                                                 mid                            time  volume
0  'c': '1.19228', 'h': '1.19784', 'l': '1.18972...  2018-05-06T21:00:00.000000000Z  119139
1  'c': '1.18706', 'h': '1.19388', 'l': '1.18614...  2018-05-07T21:00:00.000000000Z   83259

您可以使用.apply(pd.Series) 来展平嵌套的mid 结构

unnested = df['mid'].apply(pd.Series)
df = df.join(unnested).drop(columns='mid')

结果:

                             time  volume        c        h        l        o
0  2018-05-06T21:00:00.000000000Z  119139  1.19228  1.19784  1.18972  1.19581
1  2018-05-07T21:00:00.000000000Z   83259  1.18706  1.19388  1.18614  1.19239

编辑: 正如@smci 所指出的,json_normalize 也可以解决问题

from pandas.io.json import json_normalize
json_normalize(data)

但列名是分层的

   complete    mid.c    mid.h    mid.l    mid.o  \
0      True  1.19228  1.19784  1.18972  1.19581
1     False  1.18706  1.19388  1.18614  1.19239

                             time  volume
0  2018-05-06T21:00:00.000000000Z  119139
1  2018-05-07T21:00:00.000000000Z   83259

【讨论】:

以上是关于将带有列表的JSON dict导入Dataframe [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将python dicts列表保存到具有垂直显示的json文件中[重复]

如何映射 json 响应并创建带有索引的简单列表

如何将带有索引列表的dict映射到新变量

如何将Pandas中的非零条目转换为带有列表的dict?

Python之dict(或对象)与json之间转化

python中json与dict之间转换