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
相关产品推荐
相关产品推荐

