熊猫concat-行旋转

时间:2020-10-10 07:23:22

标签: python-3.x

我有一个包含5000行(df_ohlc_OTF)的时间序列数据帧。 我也有一个列表器,该列表器按行1(df_latest_OTF_candle)接收行。 收到一行后,我想删除最旧的行并将新的行添加到数据框中。

现在我用这样的Concat函数来做到这一点:

if len(df_ohlc_OTF.index)>5000:
   df_ohlc_OTF = df_ohlc_OTF.drop(df_ohlc_OTF.index[0], axis='index') # remove oldest row
   df_ohlc_OTF = pd.concat([df_ohlc_OTF, df_latest_OTF_candle]) # append new row

如何加快此过程?结束时df_ohlc_OTF的大小始终与我执行一次简单旋转相同,并且我认为concat创建原始数据帧的副本并不很快。

任何帮助,不胜感激!

谢谢

2 个答案:

答案 0 :(得分:0)

一种更快的方法是将DataFrame视为环形缓冲区。保留一个单独的计数器,该计数器说明哪个位置保存着最旧的值,并且当输入新值时,只需替换最旧的行并递增计数器(以DataFrame的长度为模)。

当然,这意味着当您要读取或使用DataFrame时,您需要记住,它仅按时间顺序分为两个块:直到(包括)计数器的块(包括较旧的数据)和其余的块。这可能会使一些计算变得有些棘手,但是在大多数情况下,如果需要性能,那可能是值得的。

答案 1 :(得分:0)

谢谢! 最终有了这个快速的解决方案: 更新索引值,排序索引,更新行值

if len(df_ohlc_OTF.index)>500: # rotate or append
   df_ohlc_OTF.rename(index={df_ohlc_OTF.index[0]:latest_OTF_candle.index[-1]}, inplace=True)
   df_ohlc_OTF.sort_index(inplace=True)
   df_ohlc_OTF.iloc[-1, [high, low, open, close]] = latest_OTF_candle.iloc[-1, [high, low, open, close]]