如何获取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个组并生成一个数据帧。
答案 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