Я использую Питон deque()
реализовать простой циклический буфер:Deque в питоне панд
from collections import deque
import numpy as np
test_sequence = np.array(range(100)*2).reshape(100,2)
mybuffer = deque(np.zeros(20).reshape((10, 2)))
for i in test_sequence:
mybuffer.popleft()
mybuffer.append(i)
do_something_on(mybuffer)
мне было интересно, если есть простой способ получить то же самое в панде с помощью Series
(или DataFrame
). Другими словами, как я могу эффективно добавить одну строку в конец и удалить одну строку в начале Series
или DataFrame
?
Edit: Я попытался это:
myPandasBuffer = pd.DataFrame(columns=('A','B'), data=np.zeros(20).reshape((10, 2)))
newpoint = pd.DataFrame(columns=('A','B'), data=np.array([[1,1]]))
for i in test_sequence:
newpoint[['A','B']] = i
myPandasBuffer = pd.concat([myPandasBuffer.ix[1:],newpoint], ignore_index = True)
do_something_on(myPandasBuffer)
Но это болезненно медленнее, чем метод deque()
.
Я сомневаюсь, что это более эффективно для этого в пандах. По моему мнению, нет встроенного поведения в очереди (но вы можете написать свою собственную оболочку вокруг кадрового фрейма pandas, используя метод concat и/или используя индексные срезы) – dorvak
Неудовлетворительный ответ: используйте HDF5Store. –
Эй, Энди, спасибо тебе за ответ. Что ты конкретно имеешь ввиду? Не могли бы вы привести пример? благодаря – Fra