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

2024-09-18 01:44:01 发布

您现在位置:Python中文网/ 问答频道 /正文

也有类似的问题,但没有一个能处理我的数据帧在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']将保持为空。在

^{pr2}$

所以很明显这是有原因的,我不知道这些东西是怎么工作的。如果我理解如何在HDFStore中附加表/数据帧,我当然可以理解其中的逻辑。在

我还可以将数据帧保存在内存中,在某种字典中,然后在末尾将它们分配给HDFStore。不知怎么的,我有一个错误的想法,认为这样做可以节省记忆,也许我也错了。在


Tags: 数据store代码infromimport示例dataframe
1条回答
网友
1楼 · 发布于 2024-09-18 01:44:01

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

  • 给出一个iterable列表:[(timeA, key1, value1), (timeB, key1, value2), (timeC, key2, value1)]
  • HDF存储中需要两个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

我很有信心有一种更有效的方法来做到这一点,包括行数和资源,但这是我印象最深的Python。如果dataTuples对象很大(比如>;=RAM),那么我的答案可能需要改变。在

一般来说,这里的想法是在写入存储之前完整地创建每个数据帧。当我在这里结束时,我意识到您也可以做您选择的事情,而您缺少的是需要使用一个table format来指定存储,这将启用附加。当然,一次追加一行可能不是一个好主意。在

相关问题 更多 >