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

Dask读取不规则CSV出现DtypeWarning,如何不关闭low_memory解决?

解决方案

问题根源

Dask 默认采用分块策略读取 CSV 文件,每个块会独立推断列的数据类型:当某字符串列的后半段全是空值时,后半段分块会将该列推断为float类型,与前半段分块推断的字符串类型冲突,进而触发 DtypeWarning。你不想使用的low_memory=False本质是全量读取后再推断类型,因此会大幅降低速度。

最优优化方案

显式指定目标列的数据类型,完全避免分块类型推断的冲突,该方案几乎没有额外性能损耗,不需要牺牲读取效率。

优化后代码如下:

import pandas as pd
import dask.dataframe as dd
    
length = 10000000
ratio = 0.9
A = {'A': [0.07]*length, 'B': ['a']*int(length*ratio) + [float('nan')]*(length-int(length*ratio))}
pd.DataFrame(A).to_csv('testing.csv', index=False)

df = dd.read_csv(
    'testing.csv',
    # 核心配置:提前指定各列数据类型,消除分块推断的差异
    dtype={
        'A': 'float64',
        'B': 'string' # 若兼容旧版本pandas可替换为object类型
    },
    # 可选配置:统一空值识别规则,进一步避免解析差异
    na_values=['', 'nan', 'NaN'],
    keep_default_na=True
)['B'].compute().dropna().tolist()

适配多列场景的备选方案

如果需要读取的列数量较多,逐个指定类型成本较高,可以先读取文件前10%的行做类型预推断,再将推断结果传入dd.read_csv的dtype参数即可,该预处理的开销远低于全量扫描的成本。
如果仅需要使用部分列,可额外增加usecols参数指定加载列,进一步降低内存占用和类型配置成本。


内容的提问来源于stack exchange,提问作者Mandias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:21:04