0

有类似的问题,但没有一个能处理我的数据框位于 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。我不知何故有一个错误的想法,即这样做可以节省内存,也许我也错了。

4

1 回答 1

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

我非常有信心有一种更有效的方法来做到这一点,无论是在行数方面还是在资源方面,但这是最让我印象深刻的pythonic。如果dataTuples对象很大(例如 >= RAM),那么我的答案可能必须改变。

一般来说,这里的想法是在写入存储之前完整地创建每个数据帧。当我在这里完成时,我意识到您也可以做您选择的事情,而您缺少的部分是需要使用表格格式指定商店,这可以进行追加。当然,一次添加一行可能不是一个好主意。

于 2016-08-30T19:39:23.753 回答