当前位置: 首页 > news >正文

网站客户案例广州宣布5条优化措施

网站客户案例,广州宣布5条优化措施,网站建设需要的技术人员,iis配置wap网站Dask read_csv 数据类型不一致问题深度解析 问题描述 在使用 Dask 的 read_csv 函数读取多个 CSV 文件时,如果同一列在不同文件中包含不同的数据类型(比如一个文件全是整数,另一个文件包含英文字符),经常会遇到类型转换…

Dask read_csv 数据类型不一致问题深度解析

问题描述

在使用 Dask 的 read_csv 函数读取多个 CSV 文件时,如果同一列在不同文件中包含不同的数据类型(比如一个文件全是整数,另一个文件包含英文字符),经常会遇到类型转换错误。本文将从源码层面深入分析这个问题的根本原因。

核心问题分析

1. 数据类型推断机制

Dask 在处理多个 CSV 文件时,只从第一个文件的开头部分采样来推断数据类型,然后将这个推断出的数据类型强制应用到所有文件的所有数据块上。

源码分析

dask/dask/dataframe/io/csv.pyread_pandas 函数中:

def read_pandas(reader,urlpath,blocksize="default",lineterminator=None,compression=None,sample=256000,  # 默认只采样256KBenforce=False,assume_missing=False,storage_options=None,include_path_column=False,**kwargs,
):# ... 其他代码 ...# 从第一个文件采样head = reader(BytesIO(b_sample), **kwargs)

这里的 b_sample 来自 read_bytes 函数,只从第一个文件采样

# dask/dask/bytes/core.py
with OpenFile(fs, paths[0], compression=compression) as f:# 只读取第一个文件的样本if delimiter is None:sample = f.read(sample)else:# 确保在完整行边界结束sample_buff = f.read(sample)while True:new = f.read(sample)if not new:breakif delimiter in new:sample_buff = (sample_buff + new.split(delimiter, 1)[0] + delimiter)breaksample_buff = sample_buff + new

2. 数据类型强制应用

text_blocks_to_pandas 函数中,将推断出的数据类型保存:

dtypes = head.dtypes.to_dict()

然后在 pandas_read_text 函数中对每个数据块强制应用这些数据类型:

def pandas_read_text(reader, b, header, kwargs, dtypes=None, ...):# ... 其他代码 ...df = reader(bio, **kwargs)if dtypes:coerce_dtypes(df, dtypes)  # 强制类型转换

3. 类型转换和错误检测

coerce_dtypes 函数中处理类型转换:

def coerce_dtypes(df, dtypes):bad_dtypes = []errors = []for c in df.columns:if c in dtypes and df.dtypes[c] != dtypes[c]:actual = df.dtypes[c]desired = dtypes[c]try:df[c] = df[c].astype(dtypes[c])except Exception as e:bad_dtypes.append((c, actual, desired))errors.append((c, e))if bad_dtypes:# 抛出详细的错误信息raise ValueError(dtype_msg)

采样机制详解

默认采样大小

Dask 的默认采样大小只有 256KB(约25万字节),这对于大型文件来说是非常小的。

采样策略

  1. 只从第一个文件采样:不会扫描其他文件
  2. 从文件开头开始:只读取文件的前256KB
  3. 确保完整行边界:如果指定了分隔符,会确保采样在完整行边界结束

问题场景示例

假设有两个CSV文件:

file1.csv(很大,有1000万行):

id,name,value
1,Alice,100
2,Bob,200
...
9999999,Charlie,9999999
a,David,invalid  # 第1000万行有字符串

file2.csv

id,name,value
b,Eve,300
c,Frank,400

Dask的处理流程:

  1. file1.csv 采样前256KB(可能只到第9999999行)
  2. 推断 id 列为 int64 类型
  3. 处理 file1.csv 时:1,2,3...int64
  4. 处理 file1.csva 行时:尝试转换为 int64 → 失败 ❌
  5. 处理 file2.csv 时:尝试将 b,c 转换为 int64 → 失败 ❌

解决方案

1. 手动指定数据类型(推荐)

# 将可能有混合类型的列指定为object类型
df = dd.read_csv('*.csv', dtype={'id': 'object'})

2. 使用 assume_missing 参数

# 假设所有未指定的整数列都包含缺失值,转换为浮点数
df = dd.read_csv('*.csv', assume_missing=True)

3. 增加采样大小

# 增加采样字节数,提高类型推断准确性
df = dd.read_csv('*.csv', sample=10000000)  # 10MB采样

4. 预处理数据

# 在读取前统一数据类型
import pandas as pd# 先读取小样本确定所有可能的数据类型
sample_df = pd.read_csv('file1.csv', nrows=1000)
print(sample_df.dtypes)# 然后指定合适的dtype
df = dd.read_csv('*.csv', dtype={'id': 'object', 'value': 'float64'})

设计原因

Dask 采用这种设计主要是为了性能考虑:

  1. 避免全文件扫描:不需要在读取阶段扫描所有文件来确定数据类型
  2. 保持延迟计算:维持 Dask 的延迟计算优势
  3. 内存效率:避免将大量数据加载到内存中进行类型推断

但代价是要求所有文件的数据类型必须一致,或者需要用户手动指定数据类型。

最佳实践

  1. 数据标准化:在生成CSV文件时,确保同一列在所有文件中使用相同的数据类型
  2. 明确指定dtype:对于可能有混合类型的列,明确指定为 object 类型
  3. 合理设置采样大小:根据数据特点调整 sample 参数
  4. 数据验证:在读取前先检查数据的一致性

总结

Dask read_csv 的数据类型不一致问题源于其只从第一个文件开头采样256KB来推断类型的机制。这种设计在性能和数据一致性之间做了权衡。理解这个机制后,我们可以通过手动指定数据类型、调整采样大小或预处理数据等方式来解决这个问题。

对于需要处理大量异构CSV文件的场景,建议在数据生成阶段就做好类型标准化,或者在读取时明确指定数据类型,这样可以避免运行时错误并提高处理效率。

http://www.dtcms.com/a/592065.html

相关文章:

  • 做传奇开服一条龙网站哪个好沈阳包装设计公司
  • 网站开发设计南邮拓者吧官网
  • 佛山网站设计特色玉溪网站建设现状
  • 泉州网站建设培训机构xhinacd.wordpress
  • 公司网站定位建议wordpress导航文件夹
  • 贵阳两学一做网站世界500强企业名录
  • 网站制作找云优化网络安装公司
  • 抚顺网站开发招聘个人工商户做网站要上税吗
  • 国内建网站流程开网店需要什么准备
  • 海珠建设网站2345浏览器官方网站
  • 企业做网页还是网站企业网页是什么
  • 上海网站建设维护网站底部导航设置
  • 后台网站设计WordPress要学多久
  • 驻马店制作网站的公司培训网站建设机构
  • 科技类网站色彩搭配什么行业做网站搜索
  • 防网站黑客网站推广优化c重庆
  • 建筑工程招标网站黑镜wordpress主题
  • 网站用什么格式的图片格式wordpress改页面宽度
  • 花都营销型网站建设公司成都网站建设哪家好
  • 盛泽建设局网站小公司网络组建
  • 东莞市美时家具营销型网站广东seo站外推广折扣
  • 大学专业网站做内容网站好累
  • 社团的工商年检网站在哪里做临沂网站改版
  • 石家庄网站制作报价开发一个手机软件app需要多少钱
  • 一个网站有几个快照江苏苏州有什么好玩的
  • 福州最好的网站设计服务公司安徽汽车网网站建设
  • 做阿里巴巴网站需要多少钱免费制作永久企业网站
  • 网站建设go你会回来感谢我的正能量视频
  • 营销型 手机网站重庆建设工程信息网安管监督
  • 画册设计网站推荐WordPress产品录入