高效地向Pandas Series或DataFrame中添加单行数据

4
我希望使用Pandas实时处理系列数据。每秒钟,我需要将最新的观测值添加到现有的系列中。我的系列被分组到DataFrame中,并存储在HDF5文件中。
这是我目前的做法:
>> existing_series = Series([7,13,97], [0,1,2]) 
>> updated_series = existing_series.append( Series([111], [3]) )

这是最有效的方式吗?我已经阅读了无数帖子,但没有找到专注于高频数据效率方面的内容。

编辑:我刚刚了解了 shelve 和 pickle 模块。它们似乎可以实现我想做的事情,即将列表保存在磁盘上。由于我的列表很大,是否有任何方法可以不将整个列表加载到内存中,而是一次性高效地附加值?


2
这可能是最有效的方法,但Pandas / numpy结构基本上不适合高效地增长。它们在创建时具有固定的大小并保持不变时效果最佳。 - BrenBarn
1
appendconcat的包装器,因此concat可能会稍微更有效率,但正如@BrenBarn所说,Pandas可能不适合每秒更新HDF5文件。如果您绝对需要Pandas,是否可以收集一系列Series并定期更新文件呢? - Matti John
1
Bren关于numpy/pandas在预分配时效果最佳的说法是正确的。如果内存不受限制,只需预分配一个巨大的零数组,并在程序末尾添加,去除任何多余的零。这可能有点类似于Matti所说的内容。 - arynaq
1
明白了,有道理。你能想到哪个库更适合高效地增长序列吗? - user1883571
1个回答

3
请查看即将推出的0.10版PyTables文档,或从主分支获取。http://pandas.pydata.org/pandas-docs/dev/whatsnew.html PyTables在附加和每秒写入HDFStore方面表现相当不错。您想要存储一个DataFrame表格。然后可以以类似查询的方式选择数据,例如:
store.append('df', the_latest_df)
store.append('df', the_latest_df)
....
store.select('df', [ 'index>12:00:01' ])

如果这些都来自同一个进程,那么这将非常好用。如果您有一个写入进程,然后另一个进程正在读取,这就有点棘手了(但根据您的操作方式,这将正常工作)。
另一种选择是使用消息传递从一个进程传输到另一个进程(然后在内存中追加),这可以避免序列化问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接