DataFrame df содержит 8 строк. После вызова df.duplicated(subset=['city', 'date']).sum() получается 3. Сколько строк будет в df.drop_duplicates(subset=['city', 'date'], keep='first')?
5 строк — duplicated помечает «лишние», drop_duplicates их удаляет
3 строки — drop_duplicates оставляет только те, что помечены как дубли
8 строк — drop_duplicates не меняет исходный DataFrame без inplace=True
6 строк — duplicated с keep='first' помечает первое вхождение каждой пары