将键/值对列表转换为存储在HDFStore中的熊猫数据框

问题描述:

有类似的问题,但它们都不处理我的数据框位于HDFStore中的情况。将键/值对列表转换为存储在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。我不知何故有这种误导的想法,这样做会节省内存,也许我也是错误的。

+0

你能提供你的'timestamp/key/value'数据集的样本吗?你从哪里获得他们的格式? – MaxU

+0

我故意贬低那一点。数据本身是一个可以迭代的protobuf记录,其中包含时间戳和使用生物传感器从人体取得的一系列测量数据。我想要的是每个指标的数据框,所以每个指标基本上有两列:时间戳和值,按时间戳记索引。然后将所有这些数据帧放在一个HDFStore中。不是我的选择,这是研究人员想要的。 – izak

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

  • 鉴于iterables的列表:[(timeA, key1, value1), (timeB, key1, value2), (timeC, key2, value1)]
  • 你会想要两个DF的在HDFStore,其中:
    • store[key1] = DataFrame([value1, value2], index=[timeA, timeB])
    • store[key2] = DataFrame([value1], index=[timeC])

正确?

如果是的话,我会建议是某种在你的存储键“过滤”,创造dataframes,然后写一个整体数据框到店里,像这样的:

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,这使得附加。当然,一次追加一行可能不是一个好主意。

+0

您确认我怀疑:收集某些其他结构中的数据框,然后将它们放入HDF中。我试图避免这种情况,因为我们正在谈论数百兆字节的数据集。噢,先让它工作,稍后再做。 – izak

+0

那么,在谈论MB的时候,如果你在一台相对比较现代化的电脑上,我想你应该没问题?虽然如果你有很多商店密钥需要过滤,那可能会有问题。沿着你的想法,尝试[append](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.HDFStore.append.html#pandas.HDFStore.append)或[put ](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.HDFStore.put.html#pandas.HDFStore.put)方法。在这些情况下,您将创建1行df并将其传递给这些方法,而不是单元格值本身 – StarFox