将键/值对列表转换为存储在HDFStore中的pandas数据帧

时间:2016-08-30 14:36:35

标签: python pandas hdf

有类似的问题,但没有一个处理我的数据帧在HDFStore中的情况。

我需要将时间戳/键/值项列表转换为数据帧,并将其存储为多个数据帧,每个数据帧都在时间戳上编入索引,然后将其保存在HDFStore中。

示例代码:

from pandas import HDFStore
from pandas import DataFrame
store = HDFStore('xxx', driver="H5FD_CORE")
for i, k, v in ((0, 'x', 5), (1, 'y', 6)):
    if k not in store:
        store[k] = DataFrame()
    store[k].set_value(i, 'value', v)

此代码运行后,store['x']仍为空。

>>> store['x']
Empty DataFrame
Columns: []
Index: []

所以显然有一些原因导致这种情况不存在,而且我也不知道这些东西应该如何运作。如果我只是了解你如何附加到HDFStore中的表/数据帧,我当然可以找出逻辑。

我还可以将数据帧保存在内存中,在某种字典中,并将它们分配到最后的HDFStore。我不知何故有这种误导的想法,这样做会节省记忆,也许我也错了。

1 个答案:

答案 0 :(得分:0)

我发表评论得到一些澄清,但我还没有代表。如果没有更多的背景,我很难说你的方法是否明智,但几乎在所有情况下我都倾向于拒绝。如果我错了,请纠正我,但你要做的是:

  • 给出一系列可迭代:[(timeA, key1, value1), (timeB, key1, value2), (timeC, key2, value1)]
  • 你想在HDFStore中有两个df,其中:
    • store[key1] = DataFrame([value1, value2], index=[timeA, timeB])
    • store[key2] = DataFrame([value1], index=[timeC])

正确?

如果是这样,我建议您在商店密钥上进行某种“过滤”,创建数据框,然后将整个数据框写入商店,如下所示:

dataTuples = [(0, 'x', 5), (1, 'y', 6), ...]

# initializing the dict of lists, which will become a dict of df's
sortedByStoreKey = {storeKey: [] for idx, storeKey, val in dataTuples}

for idx, storeKey, val in dataTuples:
    sortedByStoreKey[storeKey].append([idx, storeKey]) # appending a 2-list to a list

# this can all be done with dict comprehensions but this is more legible imo
for storeKey, dfContents in sortedByStoreKey.items():
    df = pd.DataFrame(dfContents, columns=['time', 'value'])
    df['time'] = pd.to_datetime(df['time']) # make sure this is read as a pd.DatetimeIndex (as you said you wanted)
    df.set_index('time', inplace=True)
    sortedByStoreKey[storeKey] = df

# now we write full dataframes to HDFStore
with pd.HDFStore('xxx') as store:
    for storeKey, df in sortedByStoreKey.values():
         store[storeKey] = df

我非常有信心有一种更有效的方法可以做到这一点,无论是行数还是资源方面,但这是最令人震惊的。如果dataTuples对象是巨大的(如> = RAM),那么我的答案可能需要改变。

一般来说,这里的想法是在写入商店之前完整地创建每个数据帧。当我在这里结束时,我意识到你也可以做你所选择的,而你所缺少的部分是需要用table format来指定商店,这可以追加。当然,一次添加一行可能不是一个好主意。