#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)