python - 根据阈值删除行
问题描述
我有一个多索引df:
这个df概述了一些人通过网站的路径,sid
是会话,vid
是访问者ID,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
关于如何做到这一点的任何想法?
解决方案
当然,只需使用groupby
+ filter
。在这种情况下,“sid”似乎是 MultiIndex 的第 0 级,所以我们可以这样做:
df.groupby(level=0).filter(lambda x:len(x)<=3)
filter
只留下 lambda 表达式为真的组,在这种情况下,这意味着组的长度(数据帧的行)小于或等于 3。
或者,您可以保留该组的第一行,例如 3 行,而不是通过执行以下操作完全消除它:
df.groupby(level=0).head(3)