如何在Dask read_csv中为缺失的预期列设置默认值?
解决Dask读取CSV时缺失列的问题
当CSV表头和预期列不一致,指定usecols时出现ValueError,是因为你指定的列在文件中不存在。解决思路分两步:先读取文件中存在的目标列,再给缺失的列添加默认值。
方法一:先获取表头再读取数据
先快速读取文件表头,筛选出存在的列,避免读取时报错:
# 仅读取表头,获取文件实际列名 df_headers = dd.read_csv(filepath, sep=",", header=0, encoding="ISO-8859-1", nrows=0).columns.tolist() # 筛选出预期列中实际存在的部分 existing_cols = [col for col in cols if col in df_headers] # 读取数据,仅保留存在的列 df = dd.read_csv(filepath, low_memory=False, usecols=existing_cols, sep=",", header=0, encoding="ISO-8859-1", converters=_converters ) # 找出缺失的列,添加默认值(这里默认设为None,可根据需求改为''、0等) missing_cols = [col for col in cols if col not in df_headers] for col in missing_cols: df[col] = None
方法二:用lambda筛选存在的列
直接用usecols的lambda表达式,自动保留文件中存在的预期列,无需提前读取表头:
# 读取文件时仅保留属于预期列的部分 df = dd.read_csv(filepath, low_memory=False, usecols=lambda c: c in set(cols), sep=",", header=0, encoding="ISO-8859-1", converters=_converters ) # 补充缺失的列并设置默认值 missing_cols = [col for col in cols if col not in df.columns] for col in missing_cols: df[col] = None # 可自定义默认值
注意点
- 两种方法核心都是先确保读取的列都存在,再补全缺失列;
- 默认值可根据业务需求调整,比如性别列可以默认设为
'Unknown',数值列设为0等; - 你之前注释的lambda写法其实可以避免报错,但需要后续手动补全缺失列。
内容的提问来源于stack exchange,提问作者sridharnetha
相关产品推荐
相关产品推荐

