将带有列表的JSON dict导入Dataframe

时间:2018-05-08 12:08:02

标签: python json pandas dataframe

我有一个包含财务数据的字典,我想将其转换为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']])

但是如果不转换字典

,似乎无法转换为所需的格式

1 个答案:

答案 0 :(得分:0)

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