首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫-如何通过对象获取最后n组,并将它们合并成一个数据

熊猫-如何通过对象获取最后n组,并将它们合并成一个数据
EN

Stack Overflow用户
提问于 2018-10-19 15:14:40
回答 5查看 2.7K关注 0票数 13

如何在df.groupby()之后获得最后的'n‘组,并将它们合并成一个数据帧。

代码语言:javascript
运行
复制
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个组合并起来,生成一个数据帧。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-10-19 15:47:07

熊猫GroupBy对象是可迭代的。要提取可迭代的最后n个元素,通常不需要从可迭代的元素中创建一个列表并对最后n个元素进行切片。这将是内存昂贵的。

相反,您可以使用itertools.islice (按@mtraceur的建议)或使用collections.deque。两者都是在O(n)时间内工作的。

itertools.islice

与生成器不同,Pandas GroupBy对象是可重用的可迭代对象。因此,您可以通过len(g)GroupBy对象g计算组数,然后通过isliceg进行切片。或者,也许更习惯,您可以使用GroupBy.ngroups。然后使用pd.concat连接可迭代的数据文件:

代码语言:javascript
运行
复制
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,然后像以前一样级联。

代码语言:javascript
运行
复制
from collections import deque

grouped = data.groupby(data.index.date, sort=False)
res = pd.concat(deque(map(itemgetter(1), grouped), maxlen=12))

collections文档中所述:

一旦有界长度deque满了,当添加新项时,相应数量的项将从另一端丢弃.它们还可用于跟踪事务和其他数据池,在这些数据池中,只有最近的活动才感兴趣。

票数 10
EN

Stack Overflow用户

发布于 2018-10-19 15:22:56

假设您知道grouped的顺序

代码语言:javascript
运行
复制
grouped = zip(*df.groupby(data.index.date,sort=False))
pd.concat(list(grouped)[1][-12:])
票数 2
EN

Stack Overflow用户

发布于 2018-10-19 15:18:49

在列表理解和pd.concat上使用groupby.get_group

代码语言:javascript
运行
复制
pd.concat([grouped.get_group(x) for x in list(grouped.groups.keys())[-12:]])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52895305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档