我有一个包含财务数据的字典,我想将其转换为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']])
但是如果不转换字典
,似乎无法转换为所需的格式答案 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