用polars对某列(某些列)进行替换操作的时候,如果直接用str下面的方法替换,会报错。
列数少就直接print
列数多就输出到parquet文件格式,用duckdb直接打开看,方法可以参考这篇文章duckdb查看文件方法
原始数据预览

import polars as plfrom polars import selectors as cspath_in = r"D:\《西游记》妖魔鬼怪全属性统计表(增量数值版).xlsx"# 比如这里把 结局 这个字段里面的 ”未知” 替换为 None(让它显示为Null ,不是 空值 ,'' != Null )df = (pl.read_excel(path,sheet_name='一、取经前及早期妖王(第1–7回)').drop(['序号','战力','法力','防御']).with_columns(pl.col('结局').str.replace_all(r'未知',None)))print(df)# 上面代码会报错,如下"""polars.exceptions.ComputeError: value cannot be 'null' in 'replace' expressionThis error occurred in the following expression:col(”结局”).str.replace([”未知”, null.cast(String)])"""
错误的意思是'replace'这个表达式不支持null(暂时,有可能后面版本就支持了,当前版本是1.41.2)
换成下面的写法就可以
import polars as plfrom polars import selectors as cspath_in = r"D:\《西游记》妖魔鬼怪全属性统计表(增量数值版).xlsx"# 可以这样写路径,不过默认的地址要看你python安装地址,或者手动设置path_out = r'替换后.parquet'# 也可以明确指定,如# path_out = r'D:\替换后.parquet'df = (pl.read_excel(path,sheet_name='一、取经前及早期妖王(第1–7回)').drop(['序号','战力','法力','防御']).with_columns(# 这几个分别执行看,可以把其他的先注释# 对某列进行替换 ,不用str下面的replace_all , 直接对series进行replacepl.col('结局').replace('未知',None),# 对文本列进行替换cs.string().replace('不详',None),# 自己明确知道要替换的列pl.col(['洞府/所在地','武器/法宝']).replace('不详',None),# 对所有列进行替换,此处需要确保所有列的类型都是文本的,如果有其他类型,依然报错,所以在上面有drop语句# 可以把drop去掉看看是什么错误pl.all().replace('不详',None),# 支持连续替换# python 里面的 polars 如下最后多个写逗号”,” , 没问题 ,rust里面不可以# 为什么习惯在python里面加上这个逗号呢,因为复制的时候不想去处理逗号pl.all().replace('不详',None).replace('未知',None),))df.write_parquet(path_out)
为什么这么写就可以呢?简单理解就是 polars 目前支持对整体(整列,series,名字没什么影响)进行替换None,不支持对局部单个进行替换None。
.str.replace_all() 这个就是对局部单个.replace() 这个就是对整体
.str.replace_all() 与 .replace() 函数本身的区别也有一些
比如是否支持正则表达式 ,替换前后的列是否支持表达式,是否可以用df里面已有的列等。
除此之外,还可以通过pl.when then otherwise来写,不过一般以上内容就可以了。