我正在处理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