Панды GroupBy
объекты являются итеративными.Для извлечения последних n элементов итерируемого, как правило, нет необходимости создавать список из итерируемого и нарезать последние n элементов.Это будет дорого для памяти.
Вместо этого вы можете использовать либо itertools.islice
(как предложено @mtraceur), либо collections.deque
.Оба работают за O ( n ).
В отличие от генератора, объект Pandas GroupBy
является итеративным, которыйможно использовать повторно.Следовательно, вы можете вычислить количество групп с помощью len(g)
для GroupBy
объекта g
и затем нарезать g
с помощью islice
.Или, возможно, более идиоматический, вы можете использовать GroupBy.ngroups
.Затем используйте pd.concat
, чтобы объединить итерируемые кадры данных:
from operator import itemgetter
g = data.groupby(data.index.date, sort=False)
res = pd.concat(islice(map(itemgetter(1), g), max(0, g.ngroups-12), None))
В качестве альтернативы, вы можете использовать collections.deque
и укажите maxlen
, затем объедините, как и раньше.
from collections import deque
grouped = data.groupby(data.index.date, sort=False)
res = pd.concat(deque(map(itemgetter(1), grouped), maxlen=12))
Как описано в collections
документах:
После заполнения ограниченной длины deque
, когда новыйдобавляются элементы, соответствующее количество элементов отбрасывается с противоположного конца .... Они также полезны для отслеживания транзакций и других пулов данных, в которых интересна только самая последняя активность.