如何获得 Pandas' groupBy 中的最后一组?
How to get last group in Pandas' groupBy?
我希望通过以下方式获得我组的最后一组:
df.groupby(pd.TimeGrouper(freq='M')).groups[-1]:
但这给出了错误:
KeyError: -1
使用 get_group
是没有用的,因为我不知道最后一组的值(除非有特定的方法来获取该值?)。我也可能想得到最后 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
以埃德为例
你可以切掉最后一组。这些组以正确的顺序迭代(意味着给定的顺序,或排序,由选项确定)。
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)]
我希望通过以下方式获得我组的最后一组:
df.groupby(pd.TimeGrouper(freq='M')).groups[-1]:
但这给出了错误:
KeyError: -1
使用 get_group
是没有用的,因为我不知道最后一组的值(除非有特定的方法来获取该值?)。我也可能想得到最后 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
以埃德为例 你可以切掉最后一组。这些组以正确的顺序迭代(意味着给定的顺序,或排序,由选项确定)。
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)]