【问题标题】:Efficiently add single row to Pandas Series or DataFrame高效地将单行添加到 Pandas Series 或 DataFrame
【发布时间】:2012-11-24 23:20:30
【问题描述】:

我想使用 Pandas 实时处理系列。每一秒,我都需要将最新的观察结果添加到现有系列中。我的系列被分组到一个 DataFrame 中并存储在一个 HDF5 文件中。

这是我目前的做法:

>> existing_series = Series([7,13,97], [0,1,2]) 
>> updated_series = existing_series.append( Series([111], [3]) )

这是最有效的方法吗?我阅读了无数帖子,但找不到任何关注高频数据效率的帖子。

编辑:我刚刚阅读了有关搁置和泡菜的模块。似乎他们会实现我想要做的事情,基本上将列表保存在磁盘上。因为我的列表很大,有没有办法不将完整列表加载到内存中,而是一次有效地追加一个值?

【问题讨论】:

  • 这可能和任何方法一样高效,但 Pandas/numpy 结构从根本上不适合高效增长。当它们以固定大小创建并保持不变时,它们的效果最佳。
  • appendconcat 的包装器,因此concat 的效率会稍微高一些,但正如@BrenBarn 所说,Pandas 可能不适合每秒更新 HDF5 文件。如果您出于某种原因绝对需要 Pandas,您可以收集系列列表并定期更新文件吗?
  • Bren 关于 numpy/pandas 在预分配时工作得最好的说法是正确的。如果内存没有限制,只需预先分配一个巨大的 zeros 数组并在程序末尾追加删除任何多余的零。我想这有点像马蒂所说的。
  • 明白,有道理。有没有你能想到的更适合高效增长系列的库?

标签: python performance pandas time-series


【解决方案1】:

查看 0.10 中的新 PyTables 文档(即将推出),或者您可以从 master 获取。 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' ])

如果这一切都来自同一个过程,那么这将非常有效。如果您有一个 writer 进程,然后另一个进程正在读取,这有点棘手(但会根据您的操作正常工作)。

另一种选择是使用消息传递从一个进程到另一个进程(然后附加到内存中),这样可以避免序列化问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多