pandas - 如何获取groupby对象的最后n组并将它们组合为数据帧

sto*_*ade 12 python pandas pandas-groupby

如何获取最后的'n'组df.groupby()并将它们组合为数据帧.

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

grouped.ngroups我做了我获得组277的总数.我想结合最后12组并生成数据帧.

jpp*_*jpp 9

Pandas GroupBy对象是可迭代的.要提取iterable 的最后n个元素,通常不需要从iterable创建列表并切片最后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))
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

collections文档中所述:

一旦有限长度deque已满,当添加新项目时,相对数量的项目将从相对端丢弃....它们对于跟踪仅涉及最近活动的交易和其他数据池也很有用.