Dask中DataFrame.assign失效?如何拆分街道名与编号列
解决Dask处理超大TXT文件时的列分配TypeError问题
错误原因
你遇到的TypeError是因为str.extract('(\d+)')返回的是Dask DataFrame(即使只有一个捕获组,默认也会生成多列结构),而DataFrame.assign()方法只接受Series、标量或可调用对象,不支持直接传入DataFrame。另外你代码里的streets.compute()会把整个超大文件加载到内存,完全违背了用Dask处理大数据的初衷,必须去掉。
修正方案
我们需要:
- 提取编号时返回Series而非DataFrame
- 从原列中剥离末尾的编号,得到纯街道名称
- 保持Dask的延迟计算特性,避免提前加载全量数据
完整代码
import dask.dataframe as dd # 读取超大文件,保持延迟计算(不要调用compute()) streets = dd.read_csv('streets.txt', blocksize='25MB', header=None, names=['name']) # 1. 提取末尾的编号为int类型的Series id_num = streets['name'].str.extract(r'(\d+)', expand=False).astype(int) # 2. 提取纯街道名称(移除末尾的数字部分) street_name = streets['name'].str.replace(r'\d+$', '', regex=True).str.strip() # 3. 构建新的Dask DataFrame result = dd.concat([street_name.rename('street'), id_num.rename('id_num')], axis=1) # 若需要验证小部分数据,可调用head()而非compute() print(result.head())
关键细节说明
expand=False:让str.extract()返回Series而不是DataFrame,满足列分配的要求str.replace(r'\d+$', '', regex=True):正则匹配末尾的所有数字并移除,str.strip()清理可能存在的空格- 全程避免
compute():只有在最终需要输出结果时(比如写入文件)才调用result.to_csv()等方法,保持数据分块处理
内容的提问来源于stack exchange,提问作者Anna Hermann
相关产品推荐
相关产品推荐

