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

Polars DataFrame赋值报错:ValueError,版本0.13.55兼容问题

问题解决:Polars升级后df[i, col] = value赋值报错

报错原因

Polars 0.13.55版本调整了索引赋值的语法逻辑,不再支持df[row_idx, col_name] = scalar_value这种逐行赋值方式;同时这种循环逐行操作本身违背了Polars基于矢量化计算的设计初衷,不仅效率低下,还容易引发版本兼容性问题。

解决方案

方案1:使用Polars推荐的矢量化操作(强烈推荐)

直接利用Polars的map_dict方法,通过字典映射批量更新列值,无需循环,效率提升显著:

import polars as pl

df = pl.DataFrame( { "IP": ['1.1.1.1', '2.2.2.2'], "ISP" : ["N/A", "N/A"] } )
isp_names = { '1.1.1.1' : 'ABC', '2.2.2.2' : 'XYZ' }

# 批量更新ISP列,匹配不到的保留原"N/A"值
df = df.with_columns(
    pl.col("IP").map_dict(isp_names, default=pl.col("ISP")).alias("ISP")
)
print(df)

输出结果:

shape: (2, 2)
┌─────────┬─────┐
│ IP      ┆ ISP │
│ ---     ┆ --- │
│ str     ┆ str │
╞═════════╪═════╡
│ 1.1.1.1 ┆ ABC │
│ 2.2.2.2 ┆ XYZ │
└─────────┴─────┘

方案2:若需保留逐行逻辑(不推荐,仅作兼容参考)

如果一定要逐行修改,可通过with_row_index添加行索引,结合when/then表达式实现,但这种方式效率远低于矢量化操作:

import polars as pl

df = pl.DataFrame( { "IP": ['1.1.1.1', '2.2.2.2'], "ISP" : ["N/A", "N/A"] } )
isp_names = { '1.1.1.1' : 'ABC', '2.2.2.2' : 'XYZ' }

# 添加行索引
df = df.with_row_index("row_idx")

for idx, row in enumerate(df.rows()):
    ip = row[1]  # 新增row_idx列后,IP为第二列
    if ip in isp_names:
        df = df.with_columns(
            pl.when(pl.col("row_idx") == idx)
            .then(pl.lit(isp_names[ip]))
            .otherwise(pl.col("ISP"))
            .alias("ISP")
        )

# 移除行索引列
df = df.drop("row_idx")
print(df)

关键提示

Polars作为高性能DataFrame库,核心优势在于矢量化计算,应尽量避免循环逐行操作。遇到条件更新列的场景,优先使用with_columns结合Polars内置表达式实现,既能保证效率,也能规避版本兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 08:30:24