Pandas groupby过滤器只过滤最后两行



我正在处理pandas操作,希望每列只选择最后两行"B";。

如何在没有reset_index和filter的情况下进行(在groupby内部进行)

import pandas as pd
df = pd.DataFrame({
'A': list('aaabbbbcccc'),
'B': [0,1,2,5,7,2,1,4,1,0,2],
'V': range(10,120,10)
})
df

我的尝试

df.groupby(['A','B'])['V'].sum()

所需输出

A  B
a  
1     20
2     30
b  
5     40
7     50
c  
2    110
4     80

IIUC,您希望获得每A.最高两个B的行

您可以计算每组递减的rank,并保持其≤2。

df[df.groupby('A')['B'].rank('first', ascending=False).le(2)]

输出:

A  B    V
1   a  1   20
2   a  2   30
3   b  5   40
4   b  7   50
7   c  4   80
10  c  2  110

尝试:

df.sort_values(['A', 'B']).groupby(['A']).tail(2)

输出:

A  B    V
1   a  1   20
2   a  2   30
3   b  5   40
4   b  7   50
10  c  2  110
7   c  4   80
def function1(dd:pd.DataFrame):
return dd.sort_values('B').iloc[-2:,1:]
df.groupby(['A']).apply(function1).droplevel(1)

B    V
A        
a  1   20
a  2   30
b  5   40
b  7   50
c  2  110
c  4   80

最新更新