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

时间:2018-10-19 15:14:41

标签: python pandas pandas-groupby

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

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 :(得分:9)

熊猫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已满,则在添加新项目时,   从另一端丢弃相应数量的项目。   它们对于跟踪交易和其他数据池也很有用   仅关注最近的活动。

答案 1 :(得分:2)

假设您知道grouped

的顺序
grouped = zip(*df.groupby(data.index.date,sort=False))
pd.concat(list(grouped)[1][-12:])

答案 2 :(得分:1)

在列表理解和#[get("/foo")] fn foo(image: State<DynamicImage>) { // Can use `image`. } 上使用pd.concat

groupby.get_group

答案 3 :(得分:0)

您可以将列表理解传递给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