将带有列表的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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章