Polars中替换全空日期列'0001-01-01'为Null报错的解决问询
问题:Polars处理全Null日期列替换时的报错解决
需求:对所有pl.Date类型列执行替换操作,将0001-01-01替换为Null。但全为Null的日期列执行map_elements时会抛出AttributeError: 'DataFrame' object has no attribute '_pyexpr'错误,且这类列无法删除,需保留后续使用。
解决方案
方法1:提前筛选非全Null的日期列处理
先识别出非全Null的日期列,仅对这些列应用自定义函数,再合并原DataFrame的其他列:
import polars as pl import datetime replace_func = lambda date: None if date == datetime.date(1,1,1) else date df = pl.DataFrame({ 'A':[datetime.date(2023,3,3),datetime.date(1,1,1),None], 'B':[1,1,3], 'C':[None,None,None] }) # 获取所有日期类型列 date_cols = df.select(pl.col(pl.Date)).columns # 筛选出非全Null的日期列(空值数不等于总行数) non_null_date_cols = [col for col in date_cols if df.select(col).null_count().item() != df.height] # 仅处理非全Null日期列,保留其他列不变 result_df = df.with_columns( pl.col(non_null_date_cols).map_elements(replace_func) ) print(result_df)
方法2:改用Polars原生表达式(推荐)
放弃map_elements,用Polars原生的when/then/otherwise语法实现替换,原生表达式对全Null列兼容性更好,无需额外筛选:
import polars as pl import datetime df = pl.DataFrame({ 'A':[datetime.date(2023,3,3),datetime.date(1,1,1),None], 'B':[1,1,3], 'C':[None,None,None] }) # 原生表达式实现替换,自动兼容全Null列 result_df = df.with_columns( pl.col(pl.Date) .when(pl.col(pl.Date) == datetime.date(1,1,1)) .then(None) .otherwise(pl.col(pl.Date)) ) print(result_df)
说明
- 方法1适用于必须使用自定义lambda函数的场景,通过提前过滤避免报错
- 方法2性能更优,且无需处理列筛选逻辑,是Polars的推荐写法
内容的提问来源于stack exchange,提问作者SysRIP
相关产品推荐
相关产品推荐

