首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当使用pyarrow读取CSV文件时,如何为所有列指定一个dtype?

当使用pyarrow读取CSV文件时,如何为所有列指定一个dtype?
EN

Stack Overflow用户
提问于 2022-03-18 21:06:54
回答 1查看 511关注 0票数 0

我想读一个很大的CSV文件。我所有的列都是浮动的,但是比罗似乎在推测int64。

如何为所有列指定一个dtype?

代码语言:javascript
运行
复制
import gcsfs
import pyarrow.dataset as ds

fs = gcsfs.GCSFileSystem(project='my-google-cloud-project')

my_dataset = ds.dataset("bucket/foo/bar.csv", format="csv", filesystem=fs)

my_dataset.to_table()

它产生:

代码语言:javascript
运行
复制
ArrowInvalid                              Traceback (most recent call last)
........py in <module>
----> 65 my_dataset.to_table()

File /opt/conda/envs/py39/lib/python3.9/site-packages/pyarrow/_dataset.pyx:491, in pyarrow._dataset.Dataset.to_table()

File /opt/conda/envs/py39/lib/python3.9/site-packages/pyarrow/_dataset.pyx:3235, in pyarrow._dataset.Scanner.to_table()

File /opt/conda/envs/py39/lib/python3.9/site-packages/pyarrow/error.pxi:143, in pyarrow.lib.pyarrow_internal_check_status()

File /opt/conda/envs/py39/lib/python3.9/site-packages/pyarrow/error.pxi:99, in pyarrow.lib.check_status()

ArrowInvalid: In CSV column #172: Row #28: CSV conversion error to int64: invalid value '6.58841482364418'
EN

Stack Overflow用户

回答已采纳

发布于 2022-03-18 23:48:14

Pyarrow的dataset模块以块形式读取CSV文件(我认为缺省值为1MB ),并并行处理这些块。这使得列推断有点棘手,它通过使用第一个块来推断数据类型来处理这个问题。因此,当文件的第一个块有一个看起来是整数的列时,您所得到的错误是非常常见的,但是在以后的块中,该列有十进制值。

如果预先知道列名,则可以指定列的数据类型:

代码语言:javascript
运行
复制
import pyarrow as pa
import pyarrow.csv as csv
import pyarrow.dataset as ds

column_types = {'a': pa.float64(), 'b': pa.float64(), 'c': pa.float64()}
convert_options = csv.ConvertOptions(column_types=column_types)
custom_csv_format = ds.CsvFileFormat(convert_options=convert_options)
dataset = ds.dataset('/tmp/foo.csv', format=custom_csv_format)

如果你不知道列的名字,那么事情就更棘手了。但是,听起来所有的列都是float64。在这种情况下,由于您只有一个文件,您可能可以这样做,作为解决办法:

代码语言:javascript
运行
复制
dataset = ds.dataset('/tmp/foo.csv', format='csv')
column_types = {}
for field in dataset.schema:
  column_types[field.name] = pa.float64()
# Now use column_types as above

这是因为我们两次调用pa.dataset(...),并且它会有少量的开销。这是因为每次调用pa.dataset(...)时,pyarrow都会打开数据集中第一个文件的第一个块来确定模式(这就是为什么我们可以使用dataset.schema)。

如果您有多个具有不同列的文件,则此方法将无法工作。在这种情况下,我建议发送Arrow user@ case列表,我们可以就解决问题的不同方法进行更一般性的讨论。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71533197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档