为了账号安全,请及时绑定邮箱和手机立即绑定

将字典拆分为 Pandas DataFrame

将字典拆分为 Pandas DataFrame

慕标5832272 2021-10-26 15:43:59
我正在下载财务数据,这些数据来自 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 vrecord_converter = convrec if conv is None else convcolumn_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 colmapdf = pd.DataFrame([list(record_converter(rec, cmap)) for rec in r.get('candles')])df.columns = list(cmap.values())它有效,但速度不是很快,因为我需要将“中间”分成不同的列?是否有一些更直接的方法可以在不使用循环的情况下将其放入数据帧中?例如,使用 numpy 或 pandas 来完成繁重的工作?期望的结果应该是一个 Pandas 数据框,看起来像这样:Date                    Open    High    Low     Close   Volum2004-05-31 21:00:00    6.0726   6.0726  6.0726  6.0726  22004-06-01 21:00:00    6.0879   6.0879  6.0879  6.0879  2
查看完整描述

2 回答

?
米脂

TA贡献1836条经验 获得超3个赞

这样的事情会起作用(您的输入列表称为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


查看完整回答
反对 回复 2021-10-26
?
波斯汪

TA贡献1811条经验 获得超4个赞

使用 pandas 函数会更快更简单。例如,它可以是很好的起点。如果有必要,我添加了重命名索引和枢轴以制作关闭、最高、最低、打开列:


import pandas as pd


d = {'complete': True,

 'volume': 2,

 'time': '2004-05-31T21:00:00.000000000Z',

 'mid': {'o': '6.07260', 'h': '6.07260', 'l': '6.07260', 'c': '6.07260'}}


df = pd.DataFrame(d)

df.rename(index={'o': 'Open', 'h': 'High', 'l': 'Low', 'c': 'Close'}, inplace=True)

df['column'] = df.index


df = pd.pivot_table(df, columns=['column'], index=['complete', 'time', 'volume'], values=['mid'], aggfunc=np.sum)

pd.set_option('display.max_columns', 1000)


查看完整回答
反对 回复 2021-10-26
  • 2 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号