Панды - как получить последние n групп объекта groupby и объединить их в виде кадра данных - PullRequest
0 голосов
/ 19 октября 2018

Как получить последние 'n' групп после df.groupby() и объединить их в виде кадра данных.

data = pd.read_sql_query(sql=sqlstr, con=sql_conn, index_col='SampleTime')
grouped = data.groupby(data.index.date,sort=False)

После выполнения grouped.ngroups я получаю общее количество групп 277. Я хочу объединить последние 12 групп и сгенерировать кадр данных.

Ответы [ 4 ]

0 голосов
/ 19 октября 2018

Панды GroupBy объекты являются итеративными.Для извлечения последних n элементов итерируемого, как правило, нет необходимости создавать список из итерируемого и нарезать последние n элементов.Это будет дорого для памяти.

Вместо этого вы можете использовать либо itertools.islice (как предложено @mtraceur), либо collections.deque.Оба работают за O ( n ).

itertools.islice

В отличие от генератора, объект 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

В качестве альтернативы, вы можете использовать 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, когда новыйдобавляются элементы, соответствующее количество элементов отбрасывается с противоположного конца .... Они также полезны для отслеживания транзакций и других пулов данных, в которых интересна только самая последняя активность.

0 голосов
/ 19 октября 2018

Предполагая, что вы знаете порядок grouped

grouped = zip(*df.groupby(data.index.date,sort=False))
pd.concat(list(grouped)[1][-12:])
0 голосов
/ 19 октября 2018

Вы можете передать понимание списка на pd.concat():

import pandas as pd

df = pd.DataFrame([
['A',1,2],
['A',7,6],
['B',1,3],
['B',9,9],
['C',1,8],
['A',4,3],
['C',7,6],
['D',4,2]],
columns=['Var','Val1','Val2'])

last_n = 2
grouped = df.groupby('Var')

pd.concat([grouped.get_group(group) for i, group in enumerate(grouped.groups) if i>=len(grouped)-last_n])

Выход:

  Var  Val1  Val2
4   C     1     8
6   C     7     6
7   D     4     2
0 голосов
/ 19 октября 2018

используйте pd.concat в списках и groupby.get_group

pd.concat([grouped.get_group(x) for x in list(grouped.groups.keys())[-12:]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...