Python Polars:如何用字典值替换DataFrame列中列表内的字符串?
问题原因与解决指导
错误核心原因
你的SKU列数据类型是List(Utf8)(每个单元格是字符串列表),但调用的.str.replace_all是针对单个字符串(Utf8类型)的方法,Polars不允许直接在List类型列上使用字符串处理方法,因此触发SchemaError。同时循环替换的方式既没处理List的嵌套结构,在大型DataFrame上的执行效率也极低。
正确处理方案
根据SKU列的实际存储情况,选择对应方案:
情况1:SKU列确实是List(Utf8)类型
直接对列表中的每个元素批量替换,用Polars内置的映射表达式避免循环:
# 将替换字典转为Polars映射表达式 replace_map = pl.map_dict(df_unique) # 对SKU列的每个列表元素应用替换逻辑 df = df.with_columns( SKU=pl.col("SKU").list.eval(replace_map.element()) )
情况2:SKU列是伪装成列表的字符串(如示例的"('000000009100000749',)")
先将字符串解析为真正的List(Utf8),再执行替换:
# 第一步:解析字符串为List(Utf8) df = df.with_columns( SKU=pl.col("SKU") .str.replace(r"^\('|'\)$", "") # 移除前后的('和') .str.split(",") # 按逗号分割为列表 .list.eval(pl.element().str.strip()) # 清理每个元素的多余空格 ) # 第二步:批量替换列表元素 replace_map = pl.map_dict(df_unique) df = df.with_columns( SKU=pl.col("SKU").list.eval(replace_map.element()) )
关键提示
- 大型DataFrame务必使用Polars的内置表达式(如
map_dict、list.eval),避免Python循环,前者性能是后者的数十倍甚至上百倍。 - 处理前可先用
df.schema确认SKU列的真实数据类型,避免对类型判断失误。
内容的提问来源于stack exchange,提问作者DBOak
相关产品推荐
相关产品推荐

