如何在Pandas的groupBy中获取最后一组?

7

我希望通过以下方法获取我的最后一组:

df.groupby(pd.TimeGrouper(freq='M')).groups[-1]:

但是这会报错:

KeyError:-1

使用 get_group 是无用的,因为我不知道最后一组的值(除非有一种特定的方法可以获得该值?)。此外,我可能想要获取最后两个组等等。

我该如何做到这一点?


你想要群组还是最后一个值?例如 df.groupby(pd.TimeGrouper(freq='M')).last() 返回每个群组的最后一个值。 - EdChum
@EdChum 不,我想要最后1组。我希望迭代该组的数据(可能会变成n组 - 'M' 也可能更改为另一个周期)。 - Tjorriemorrie
你能试试这个吗:df.groupby(pd.TimeGrouper(freq='M')).get_group(df.groupby(pd.TimeGrouper(freq='M')).last().iloc[-1].name) - EdChum
@EdChum 谢谢,那个有效。 - Tjorriemorrie
我认为在那种情况下,我会发表一个答案。 - EdChum
3个回答

5

使用Ed的示例,您可以切掉最后一组。这些组按正确的顺序迭代(按照选项确定的给定顺序或排序)。

In [12]: df = pd.DataFrame({'a':['1','2','2','4','5','2'], 'b':np.random.randn(6)})

In [13]: g = df.groupby('a')

In [14]: g.groups
Out[14]: {'1': [0], '2': [1, 2, 5], '4': [3], '5': [4]}

In [15]: import itertools

In [16]: list(itertools.islice(g,len(g)-1,len(g)))
Out[16]: 
[('5',    a         b
  4  5 -0.644857)]

我在想这些组是否已经按顺序排序,我认为它们是,但不确定。感谢您澄清了这一点。 - EdChum
您可以通过 df.groupby('x', sort=False) 命令禁用默认启用的排序功能。 - Bacon

2
你可以调用last方法来计算每个分组的最后一个值,然后使用iloc方法获取行值,并使用name属性访问索引组值。可能还有更好的方法,但我还没想到。
In [170]:
# dummy data
df = pd.DataFrame({'a':['1','2','2','4','5','2'], 'b':np.random.randn(6)})
df
Out[170]:
   a         b
0  1  0.097176
1  2 -1.400536
2  2  0.352093
3  4 -0.696436
4  5 -0.308680
5  2 -0.217767
In [179]:

gp = df.groupby('a', sort=False)
gp.get_group(df.groupby('a').last().iloc[-1].name)
Out[179]:
   a         b
4  5  0.608724
In [180]:

df.groupby('a').last().iloc[-2:]
Out[180]:
          b
a          
4  0.390451
5  0.608724
In [181]:

mult_groups = gp.last().iloc[-2:].index
In [182]:

for gp_val in mult_groups:
    print(gp.get_group(gp_val))
   a         b
3  4  0.390451
   a         b
4  5  0.608724

嗯,我正在使用date_index,所以我没问题,但是你的例子将i=4作为最后一组,而不是i=5作为最后一组。你可能需要添加可以传递sort=False的内容。虽然在a中有重复项可能并不重要。 - Tjorriemorrie
当然,好的观点。我不确定从groups返回的字典是否是排序形式,也不确定尝试对其进行排序是否安全。如果值列中有多个值(即组值),则这种方法将无法正常工作。例如,如果您使用以下代码:import operator sorted_groups = sorted(gp.groups.items(), key=operator.itemgetter(1)) - EdChum

1

最简单的方法是将分组转换为DataFrame,并像操作DataFrame一样对其进行索引。生成的DataFrame每个分组都有一行,第一列是分组索引,第二列是该分组的DataFrame。获取最后一个分组的DataFrame可以使用以下代码:

last_dataframe = pd.Dataframe(df.groupby('whatever')).iloc[-1, 1]

如果您想要索引和分组:
last_group = pd.DataFrame(df.groupby('whatever')).iloc[-1, :]

last_group[0]是最后一组的索引,last_group[1]是最后一组的数据框。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接