Dask选取DataFrame列子集时列值错位的原因及解决方法
列值错位的原因
- Dask读取CSV文件时默认仅采样文件开头的少量行推断列数、字段分隔规则、列类型,若你的CSV文件中存在部分行包含未被引号包裹的逗号分隔符、行字段数缺失/多余、换行符异常这类格式问题,采样阶段没有识别到这些异常,就会给不同分区的数据应用错误的字段拆分规则。你首次调用
compute仅展示前几行采样范围内的正常数据,看起来结构正确,但后续处理全量数据时,异常行的拆分错误就会显现,且因不同分区的异常数据分布不同,错位顺序会随机变化。
修复方法
- 读取文件时手动指定列名、列类型,同时调大采样范围避免自动推断出错,示例代码如下:
# 按照原始CSV的列顺序手动指定所有列名 col_list = ["Unnamed: 0", "val1", "val2", "crop", "val_int", "val_3", "val_4", "y"] # 手动指定每列的数据类型,避免Dask推断错误 dtype_map = { "Unnamed: 0": int, "val1": float, "val2": float, "crop": str, "val_int": float, "val_3": float, "val_4": float, "y": float } df = dd.read_csv( "table/short_table.csv", header=0, # 跳过原始文件的表头行 names=col_list, dtype=dtype_map, sample=10**9, # 采样范围设为1GB,小文件可覆盖全量内容,确保分隔规则推断正确 on_bad_lines="skip" # 可选配置,遇到格式异常的行直接跳过,避免干扰整体结构 )
- 读取完成后再选择需要的列子集即可得到列值匹配的结果:
df_sub = df[["crop", "val_int", "val1", "val2", "y"]] df_sub.compute()
- 如果调整参数后仍存在错位,可先用pandas读取全量CSV,检查是否存在格式异常的脏数据,清理后再用Dask读取即可。
内容的提问来源于stack exchange,提问作者Reut
相关产品推荐
相关产品推荐

