IIUC с использованием transform
и isin
, преобразование получит максимум для всех групповых потоков со строкой, затем мы используем isin
, если значение не находится в Keys2Filter
, тогда мы должны выбрать, если оно находится в Keys2Filter
, который вернет False
при ~isin
, затем мы проверим 2-е условие, если эта строка выдает максимальное значение группы, то мы все равно выбираем его.
s=df.groupby([df.Key,df.Date.dt.strftime('%Y-%m-%d %H')])['Value'].transform('idxmax')
Keys2Filter = (1, 2)
df=df.loc[~df.Key.isin(Keys2Filter)|df.index.eq(s)].copy()#avoid the copy error
df
Out[991]:
Key Date Value
2 1 2019-04-17 02:00:00 3
4 1 2019-04-17 01:00:00 5
5 1 2019-04-17 00:00:00 7
7 2 2019-04-17 02:00:00 9
8 2 2019-04-17 00:00:00 9
9 2 2019-04-17 01:00:00 9
10 3 2019-04-17 01:00:00 9
11 3 2019-04-17 01:00:00 9
Обратите внимание, что при использовании этого метода будет сохранен исходный порядок ваших df.