将字典拆分为 Pandas DataFrame

我正在下载财务数据,这些数据来自 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())

它有效,但速度不是很快,因为我需要将“中间”分成不同的列?


是否有一些更直接的方法可以在不使用循环的情况下将其放入数据帧中?例如,使用 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


慕标5832272
浏览 191回答 2
2回答

米脂

这样的事情会起作用(您的输入列表称为l):tempdf = pd.DataFrame(l)这产生   complete                                                mid                            time  volume0      True  {'o': '6.07260', 'h': '6.07260', 'l': '6.07260...  2004-05-31T21:00:00.000000000Z       21      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        c0      True  2004-05-31T21:00:00.000000000Z       2  6.07260  6.07260  6.07260  6.072601      True  2004-06-01T21:00:00.000000000Z       2  6.08790  6.08790  6.08790  6.08790

波斯汪

使用 pandas 函数会更快更简单。例如,它可以是很好的起点。如果有必要,我添加了重命名索引和枢轴以制作关闭、最高、最低、打开列:import pandas as pdd = {'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.indexdf = pd.pivot_table(df, columns=['column'], index=['complete', 'time', 'volume'], values=['mid'], aggfunc=np.sum)pd.set_option('display.max_columns', 1000)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python