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

如何高效搜索含文本与重复值的百万级Pandas DataFrame?

针对大DataFrame按姓名组合查询的优化方案

以下是几种针对1000万行级DataFrame的高效查询优化方案,适配不同使用场景:

  • 设置复合索引
    利用Pandas索引的快速定位特性,预先将first和last设为复合索引,后续查询的性能会显著提升(设置索引是一次性开销,适合多次重复查询的场景):

    # 预先构建复合索引
    df = df.set_index(['first', 'last'])
    # 直接通过索引定位目标记录
    result = df.loc[('john', 'smith')]
    
  • 转换为分类数据类型
    如果姓名列的重复值较多,将first和last转为category类型,能大幅降低内存占用并加速布尔比较操作:

    # 转换为分类类型
    df['first'] = df['first'].astype('category')
    df['last'] = df['last'].astype('category')
    # 执行查询
    result = df[(df['last'] == 'smith') & (df['first'] == 'john')]
    
  • 使用query方法(基于numexpr优化)
    Pandas的query方法底层借助numexpr库实现并行计算,对于大数据量的过滤操作,性能通常优于普通布尔索引:

    result = df.query("last == 'smith' and first == 'john'")
    
  • 预构建姓名-行索引映射字典
    如果需要频繁查询不同的姓名组合,预先构建哈希映射表,后续查询可直接通过键获取行索引,接近O(1)的查询效率:

    from collections import defaultdict
    
    # 预先构建映射:(first, last) → 对应的行索引列表
    name_to_indices = defaultdict(list)
    for idx, (f_name, l_name) in df[['first', 'last']].iterrows():
        name_to_indices[(f_name, l_name)].append(idx)
    
    # 查询时直接通过索引切片
    result = df.iloc[name_to_indices[('john', 'smith')]]
    
  • 分块并行处理(Dask)
    如果内存不足以容纳整个DataFrame,可使用Dask将数据分块,利用多核CPU并行执行查询:

    import dask.dataframe as dd
    
    # 将Pandas DataFrame转为Dask分块DataFrame(分区数可根据CPU核心数调整)
    ddf = dd.from_pandas(df, npartitions=4)
    # 执行查询并转为Pandas DataFrame
    result = ddf[(ddf['last'] == 'smith') & (ddf['first'] == 'john')].compute()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 10:33:33