У меня есть такой фрейм данных
Id b_num b_type b_ver price
100 55 A 0 100
101 55 A 0 50
102 55 A 1 100
103 55 A 1 60
104 30 C 2 100
105 30 C 2 50
106 30 C 2 100
107 30 C 2 60
108 30 C 4 200
109 30 C 4 55
110 30 C 4 80
111 30 C 4 120
112 30 C 4 20
Я хотел бы сохранить последнюю версию b_num и b_type, b_ver — это номер версии
Ожидаемый результат:
Id b_num b_type b_ver price
102 55 A 1 100
103 55 A 1 60
108 30 C 4 200
109 30 C 4 55
110 30 C 4 80
111 30 C 4 120
112 30 C 4 20
Спасибо
Подумайте о том, чтобы попробовать:
df.merge(df.groupby(['b_num','b_type'],as_index=False)['b_ver'].last(),
on=['b_num','b_type','b_ver'])
Вывод:
Id b_num b_type b_ver price
0 102 55 A 1 100
1 103 55 A 1 60
2 108 30 C 4 200
3 109 30 C 4 55
4 110 30 C 4 80
5 111 30 C 4 120
6 112 30 C 4 20
Использование groupby.rank()
df.loc[df.groupby(['b_num','b_type'])['b_ver'].rank(ascending=False,method = 'dense').eq(1)]
используя groupby.nlargest()
df.loc[df.groupby(['b_num','b_type'])['b_ver'].nlargest(1,keep = 'all').droplevel([0,1]).index]
используя groupby.transform()
df.loc[df.groupby(['b_num','b_type'])['b_ver'].transform('max').eq(df['b_ver'])]
Выход:
Id b_num b_type b_ver price
2 102 55 A 1 100
3 103 55 A 1 60
8 108 30 C 4 200
9 109 30 C 4 55
10 110 30 C 4 80
11 111 30 C 4 120
12 112 30 C 4 20