You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:25:36