Как и другие авторы здесь, ваш код дает ожидаемые результаты для меня, но, поскольку это не тот случай, вы позволяете мне предложить другое, хотя и гораздо менее эффективное, решение.
Начало работыреплицируя ваш фрейм данных
df = pd.DataFrame([['A123', 123, '2017-12-21', 0], ['A123', 123, '2017-12-21', -2], ['A123', 123, '2017-12-21', -10], ['FB00', 180, '2016-12-11', 80], ['FB00', 180, '2016-12-11', 80]], columns=['Cod', 'Cost', 'Date', 'VAL'])
Затем мы можем отсортировать значения по Cod, Cost, Date и VAL
df.sort_values(['Cod', 'Cost', 'Date', 'VAL'], ascending=True, inplace=True)
Вывод:
Cod Cost Date VAL
2 A123 123 2017-12-21 -10
1 A123 123 2017-12-21 -2
0 A123 123 2017-12-21 0
3 FB00 180 2016-12-11 80
4 FB00 180 2016-12-11 80
Затем мы можемотбросьте дубликаты Cod, Cost and Dates, сохраняя первую запись (наименьшее значение), оставляя нам ожидаемый результат.
df.drop_duplicates(['Cod', 'Cost', 'Date'], keep='first', inplace=True)
df.reset_index(drop=True, inplace=True)
С выводом:
Cod Cost Date VAL
0 A123 123 2017-12-21 -10
1 FB00 180 2016-12-11 80
Очень хакерский, не рекомендуется, но должен получить ожидаемый результат.