You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas基于groupby掩码筛选DataFrame的最高效方法

pandas按分组聚合条件筛选整组数据的高效方案

你原来的实现里Python层面的列表推导是性能瓶颈,当去重ticker量级较大时会有明显的性能损耗,完全可以用pandas原生的向量化接口替代,不需要中间生成ticker筛选列表。

推荐实现方式

1. 最高性能:groupby + transform 向量化实现

transform会把分组聚合的结果按原DataFrame的索引映射回每一行,直接生成和原表长度一致的布尔掩码,全程走pandas底层C实现的向量化运算,没有Python层面的循环开销,是大规模数据集下的最优选择:

# 单步完成筛选,无额外中间变量
df_new = df[df.groupby('ticker')['year'].transform('min') < 1990]

这段代码的逻辑和需求完全等价:对每个ticker分组求year的最小值,把最小值回标到该组所有行,再保留最小值小于1990的行。

2. 语义最直观:groupby.filter 专用于整组筛选

如果追求代码可读性,pandas提供了专门用于按分组条件过滤整组的filter接口,直接传入分组判断逻辑即可,不需要手动处理索引映射:

df_new = df.groupby('ticker').filter(lambda group: group['year'].min() < 1990)

选型提示

  • 数据量在百万行以上、分组数量较多时,优先选transform方案,速度比filter快2~5倍,比原来的三步列表法快10倍以上
  • 数据量中等、需要让读代码的人快速看懂逻辑时,filter方案的语义更清晰,不需要理解transform的映射逻辑

另外注意示例代码存在一处语法小错误:df.groupby('ticker').['year'].min()中groupby('ticker')后多写了一个点,正确写法是df.groupby('ticker')['year'].min(),直接运行会报语法错误。

内容的提问来源于stack exchange,提问作者Brian Barry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:42:25