Vaex加载文件生成DataFrame后读取列值报ChunkedArray无dtype属性错误
问题原因
- Vaex对不同来源的数据集底层存储逻辑不同:
- 用
vaex.from_arrays创建的小数据集,所有列默认包装为兼容numpy的数组结构,调用.values属性返回的是numpy数组,自带dtype属性,不会报错 - 从外部大文件加载的数据集,Vaex为了实现零内存拷贝的懒加载机制,计算生成的虚拟列(比如你通过
geo.inside_polygon生成的inside列)底层会直接存储为PyArrow的ChunkedArray类型。低版本Vaex的.values属性会直接返回原始的ChunkedArray对象,而该对象本身没有dtype属性,只有对应PyArrow的type属性,因此触发属性缺失报错
- 用
- 直接打印整个DataFrame不会触发报错的原因是:Vaex打印全表时只会拉取首尾少量样本数据做展示,不会直接加载整列的完整
ChunkedArray对象,也不会访问dtype属性,因此可以正常输出
解决办法
- 替换取值方法(最推荐,兼容所有版本和数据来源)
不要直接调用.values属性,改用Vaex官方提供的to_numpy()方法,该方法会自动将ChunkedArray转换为标准numpy数组,两种场景都能正常运行:
# 修改后的代码 print('col values: ' + str(df['inside'].to_numpy()))
如果只需要查看少量样本避免占用过多内存,可以先切片再取值:
# 仅加载前100行数据查看 print('col values: ' + str(df['inside'].head(100).to_numpy()))
- 适配PyArrow格式取值
如果需要保留PyArrow的存储格式不转换为numpy,可以用to_arrow()方法获取原始ChunkedArray,用type属性替代dtype获取数据类型:
arrow_arr = df['inside'].to_arrow() print(arrow_arr.type)
- 升级Vaex版本
该属性兼容问题已经在Vaex 4.15.0及以上版本修复,升级后.values属性会自动做类型适配,不需要修改原有代码:
pip install --upgrade vaex
内容的提问来源于stack exchange,提问作者afriedman111
相关产品推荐
相关产品推荐

