Dask升级后str.findall返回字符串类型而非object类型异常
Dask 2023.7.1中str.findall返回字符串而非列表的问题
问题现象
升级到Dask 2023.7.1版本后,调用ds.str.findall(regex)得到的Dask Series元素是字符串格式的列表(如"['some', 'sentence']"),而非预期的列表对象。调用compute()后,元素类型为str,不是预期的list。
复现代码
import pandas as pd import dask.dataframe as dd s = pd.Series(['some sentence 1', 'some other sentence 2', 'some other sentence 3', 'some other sentence 4']) ds = dd.from_pandas(s, npartitions=2) pattern = r'\b[a-zA-Z]+\b' ds2 = ds.str.findall(pattern) ps = ds2.compute() print(type(ps[0])) # 预期:<class 'list'>,实际:<class 'str'>
解决办法
1. 手动转换类型
使用ast.literal_eval将字符串格式的列表转为实际列表对象,可在Dask计算前后处理:
import ast # 计算后转换 ps_fixed = ps.apply(ast.literal_eval) # Dask阶段转换(保留分区计算特性) ds_fixed = ds2.apply(ast.literal_eval, meta=object) ps_fixed = ds_fixed.compute()
2. 回退Dask版本
如果不需要新版本的特性,回退到之前无此问题的版本:
pip install dask==2023.6.0 --force-reinstall
问题原因
这是Dask 2023.7.1版本中str.findall方法的已知bug,方法内部错误地将正则匹配得到的列表序列化为了字符串,未保留原列表类型。后续版本大概率会修复该问题,可关注版本更新。
内容的提问来源于stack exchange,提问作者jaroslav
相关产品推荐
相关产品推荐

