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

Polars中检索行号(索引)的推荐实现方法是什么

Polars 检索行号的推荐实现

Polars 设计层面确实没有提供类 Pandas 的原生行索引属性,你预存行索引的思路方向正确,但手动构造 Python 层面 range 序列的写法不是最优解,根据使用场景选择对应原生方法即可,性能远高于手动实现:

  • 如果你只需要获取满足过滤条件的行号,不需要返回过滤后的完整行数据:直接用 pl.arg_where() 是性能最高的方案,不需要提前给全表加索引列,也不会生成过滤后的新 DataFrame,直接返回匹配条件的0起始整数位置序列:
import polars as pl

df = pl.DataFrame({"a": [1,2,3,4,5], "b": [2,2,3,3,4]})
filter_expr = pl.col("b") == 3
# 获取匹配行的原始行号
match_indices = df.select(pl.arg_where(filter_expr)).to_series()

如果需要1起始的行号,直接对结果加1即可:pl.arg_where(filter_expr) + 1

  • 如果你需要在过滤后的结果表中同步保留原始行号:不要手动写range(len(df))构造序列,用Polars原生的pl.int_range(pl.len())生成行号列,该写法支持懒计算,处理TB级大表、LazyFrame场景下不会强制触发全表加载,性能优势明显:
filtered_df = df.with_columns(
    row_idx = pl.int_range(pl.len(), dtype=pl.UInt32)
).filter(filter_expr)
# 直接取row_idx列就能拿到对应原始行号
match_indices = filtered_df["row_idx"]

如果你是从文件读入数据,直接在读入方法(如scan_csv/scan_parquet/read_csv等)中传入row_index_name参数,读入阶段就自动生成行号列,性能比后续再加列更好:

# 读parquet文件时直接生成行号列,无需额外with_columns
lf = pl.scan_parquet("your_data.parquet", row_index_name="row_idx")

你提供的参考代码存在语法错误,with_columns 方法未正确闭合,且手动构造pl.Series('index', range(len(df)))的写法在懒计算场景下会强制触发全表计算拉取表长度,不推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:18:27