我正在下载财务数据,这些数据位于 Python 列表中的字典中,如下所示:
[{'complete': True,
'volume': 2,
'time': '2004-05-31T21:00:00.000000000Z',
'mid': {'o': '6.07260', 'h': '6.07260', 'l': '6.07260', 'c': '6.07260'}},
{'complete': True,
'volume': 2,
'time': '2004-06-01T21:00:00.000000000Z',
'mid': {'o': '6.08790', 'h': '6.08790', 'l': '6.08790', 'c': '6.08790'}}]
我有好几百万个这样的数据点,我想将它们放入 Pandas 中。
到目前为止,我已经使用了以下代码:
v = []
for keys in [x.split(":") for x in m.keys()]:
_v = r.get(keys[0])
for k in keys[1:]:
_v = _v.get(k)
v.append(_v)
return v
record_converter = convrec if conv is None else conv
column_map_ohlcv = OrderedDict([
('time', 'Date'),
('mid:o', 'Open'),
('mid:h', 'High'),
('mid:l', 'Low'),
('mid:c', 'Close'),
('volume', 'Volume')
])
cmap = column_map_ohlcv if colmap is None else colmap
df = pd.DataFrame([list(record_converter(rec, cmap)) for rec in r.get('candles')])
df.columns = list(cmap.values())
它可以工作,但它不是很快,因为我需要将“mid”分成不同的列?
是否有一些更直接的方法可以将其放入数据帧而不使用循环?例如使用 numpy 或 pandas 来完成繁重的工作?
期望的结果应该是一个看起来像这样的 Pandas 数据框:
Date Open High Low Close Volum
2004-05-31 21:00:00 6.0726 6.0726 6.0726 6.0726 2
2004-06-01 21:00:00 6.0879 6.0879 6.0879 6.0879 2
最佳答案
类似这样的东西会起作用(您的输入列表称为l
):
tempdf = pd.DataFrame(l)
产生
complete mid time volume
0 True {'o': '6.07260', 'h': '6.07260', 'l': '6.07260... 2004-05-31T21:00:00.000000000Z 2
1 True {'o': '6.08790', 'h': '6.08790', 'l': '6.08790... 2004-06-01T21:00:00.000000000Z 2
现在您可以将 mid
中的字典拆分为几列并使用 concat
:
df = pd.concat([tempdf.drop('mid', axis=1), tempdf['mid'].apply(pd.Series)], axis=1)
这给出了期望的结果:
complete time volume o h l c
0 True 2004-05-31T21:00:00.000000000Z 2 6.07260 6.07260 6.07260 6.07260
1 True 2004-06-01T21:00:00.000000000Z 2 6.08790 6.08790 6.08790 6.08790
关于python - 将字典解压到 Pandas DataFrame 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54469323/