Собственно я добился чего хотел, вот только как то длинно получилось, наверняка есть более элегантная запись:
# считаем сумму duration для каждого дня месяца по каждому устройству (двойная группировка):
data = df.groupby([pd.Grouper(key='date_start', freq='D'), 'device']).agg({'duration': 'sum'})
# из этой выборки оставляем только сумму duration более 30 минут в день, и считаем кол-во таких дней по каждому device:
new_data = data[data['duration'] > timedelta(minutes=30)].groupby('device').count().reset_index().rename(columns={'duration': 'days'})
# из результата берем только те device у которых кол-во дней >= 5 и считаем их кол-во:
print new_data[new_data['days'] >= 5]['device'].count()