Как оптимизировать работу в JupyterNotebook?
Первым делом посмотрите, как используется память:
df.memory_usage(deep=True)

А дальше оптимизируйте тип каждой колонки:

Для категориальных данных:  
df['object'].astype('category')

user_id и days, например, должны быть int type
ну и  float64  вам скорее всего тоже не нужен. Достаточно  float32 , а иногда и  float16 

Изменил тип одной из колонок с float64 на int через df.step_id.astype(int) и использование памяти уменьшилось с 4gb+ до 3,4gb . Правда комп был  абсолютно неработоспособным 15 минут, пока выполнялись операции по изменению типа столбца