Pandas Groupby多规模约束下的分组过滤代码优化
按分组规模筛选DataFrame的高效实现
原有实现的效率问题
你当前的两次独立过滤逻辑,会针对同一id分组重复执行两次规模统计计算,在处理百万行级以上的数据集时,重复计算带来的性能损耗会非常明显。
优化写法
只需要单次计算分组规模并存为中间变量,后续筛选直接复用计算结果,就可以完全实现你期望的连续比较逻辑,全程不会产生重复运算:
# 仅遍历一次分组完成规模计算 group_size = df.groupby('id', sort=False)['id'].transform('size') # 直接使用连续比较语法完成范围筛选,完全匹配 51 > size >4 的逻辑 df = df[51 > group_size > 4]
如果使用的pandas版本较低、不支持Series的链式连续比较,替换为等效的布尔组合写法即可,性能不会有任何损失:
df = df[(group_size > 4) & (group_size < 51)]
避坑提示
- 不要为了凑单行代码省略中间变量,直接在布尔判断里重复写两次groupby规模计算,这种写法虽然语法合法,但依然会触发两次分组统计,和原有低效写法没有本质区别,比如下面这种就是不推荐的实现:
df = df[(df.groupby('id',sort=False)['id'].transform('size') >4) & (df.groupby('id',sort=False)['id'].transform('size') <51)] - 链式比较的写法本身已经内置了逻辑与判断,不需要额外嵌套多余括号,也不会出现布尔运算的优先级问题。
内容的提问来源于stack exchange,提问作者Shew
相关产品推荐
相关产品推荐

