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

