Удаление строк на основе порогового значения

#python #pandas #dataframe

Вопрос:

У меня есть многоиндексный df:

Этот df описывает путь кого-либо через веб-сайт, sid сеанс, vid идентификатор посетителя, pid веб-страницы и ts время, в которое они попали на сайт

            pid    ts
sid vid 
 1   A    page1    t1
     A    page2    t2
     A    page3    t3
     A    page4    t4
     A    page5    t5
 2   B    page1    t4
 3   C    page1    t5
     C    page2    t6
 

У некоторых пользователей смехотворно длинные пути pid (1000 ), что, как я полагаю, может быть ошибкой. Однако, когда я транспонирую/поворачиваю эти данные, для транспонирования требуется целая вечность, потому что несколько путей такие длинные.

Поэтому я хочу ввести некоторый порог, при котором для каждого сеанса после некоторого числа (скажем, например, 3) он удаляет сеанс sid

Я могу установить пороговое значение для количества строк, которое равно, скажем, 3, тогда df будет выглядеть так:

            pid    ts
sid vid 
 2   B    page1    t4
 3   C    page1    t5
     C    page2    t6
 

Есть идеи, как это сделать?

Ответ №1:

Конечно, просто используйте groupby filter . В этом случае, похоже, «sid» — это уровень 0 мультииндекса, поэтому мы можем сделать:

 df.groupby(level=0).filter(lambda x:len(x)<=3)
 

filter оставляет только группы, в которых лямбда-выражение истинно, что в данном случае означает, что длина (строки фрейма данных) группы меньше или равна 3.

В качестве альтернативы вы можете оставить первые, скажем, 3 строки этой группы вместо того, чтобы полностью исключить ее, выполнив:

 df.groupby(level=0).head(3)