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

如何在Polars DataFrame的指定行索引范围更新列?

在Polars中高效更新指定列的特定行索引范围

需求与Pandas实现

需要更新Polars DataFrame中指定列的特定行索引范围,对应的Pandas实现代码如下:

import pandas as pd
df = pd.DataFrame({ "foo": [0,0,0,0] })
df["foo"].iloc[0:3] = 1
# 或者另一种写法
df.iloc[0:3, df.columns.get_loc("foo")] = 1

Polars直接切片赋值的问题

在Polars中可以通过df[0, "foo"] = 1更新单行,但尝试范围切片赋值会触发错误:

import polars as pl
df = pl.DataFrame({ "foo": [0,0,0,0] })

# 报错:TypeError: cannot use "slice(0, 3, None)" for indexing
df[0:3, "foo"] = 1

# 报错:TypeError: DataFrame object does not support `Series` assignment by index
df[0:3]["foo"] = 1

高效替代方案(避免row_number的性能开销)

方法1:构造新Series替换目标列

直接获取原列数据,切片更新后替换,适合小范围更新场景:

updated_foo = df["foo"].to_list()
updated_foo[0:3] = [1]*3
df = df.with_columns(pl.Series(updated_foo).alias("foo"))

方法2:用pl.int_range替代row_number

利用pl.int_range直接生成连续行索引序列,避免全表扫描计算行号的开销:

df = df.with_columns(
    pl.when(pl.int_range(0, pl.count()).is_between(0, 3))
    .then(1)
    .otherwise(pl.col("foo"))
    .alias("foo")
)

方法3:切片拆分+拼接(大表最优)

通过切片拆分DataFrame,更新指定段后重新拼接,Polars的切片和拼接操作基本是零拷贝,性能接近Pandas的iloc赋值:

# 拆分需要更新的部分和剩余部分
top_part = df.slice(0, 3).with_columns(foo=1)
bottom_part = df.slice(3)
# 拼接得到新的DataFrame
df = pl.concat([top_part, bottom_part])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:12:10