如何 add/change 列名与 pyarrow.read_csv?
How to add/change column names with pyarrow.read_csv?
我目前正在尝试将一个没有任何 headers 的大 csv 文件 (50GB+) 导入到 pyarrow table 中,总体目标是将该文件导出为 Parquet 格式并进一步处理它在 Pandas 或 Dask DataFrame 中。我如何在 pyarrow 中为 csv 文件指定列名和列数据类型?
我已经考虑过将 header 附加到 csv 文件。这强制完全重写文件,这看起来像是不必要的开销。据我所知,pyarrow 提供了用于定义特定列的 dtype 的模式,但是文档缺少将 csv 文件转换为箭头时这样做的具体示例 table.
假设此 csv 文件仅包含两列 "A" 和 "B" 作为简单示例。
我当前的代码如下所示:
import numpy as np
import pandas as pd
import pyarrow as pa
df_with_header = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
print(df_with_header)
df_with_header.to_csv("data.csv", header=False, index=False)
df_without_header = pd.read_csv('data.csv', header=None)
print(df_without_header)
opts = pa.csv.ConvertOptions(column_types={'A': 'int8',
'B': 'int8'})
table = pa.csv.read_csv(input_file = "data.csv", convert_options = opts)
print(table)
如果我打印出最后的 table,它不会更改列的名称。
pyarrow.Table
1: int64
3: int64
我现在如何更改加载的列名和数据类型?是否还有可能例如传递包含名称及其数据类型的字典?
您可以为列指定类型覆盖:
fp = io.BytesIO(b'one,two,three\n1,2,3\n4,5,6')
fp.seek(0)
table = csv.read_csv(
fp,
convert_options=csv.ConvertOptions(
column_types={
'one': pa.int8(),
'two': pa.int8(),
'three': pa.int8(),
}
))
但在您的情况下,您没有 header,据我所知,箭头不支持此用例:
fp = io.BytesIO(b'1,2,3\n4,5,6')
fp.seek(0)
table = csv.read_csv(
fp,
parse_options=csv.ParseOptions(header_rows=0)
)
这引发了:
pyarrow.lib.ArrowInvalid: header_rows == 0 needs explicit column names
这类似于这个问题apache arrow - reading csv file
我目前正在尝试将一个没有任何 headers 的大 csv 文件 (50GB+) 导入到 pyarrow table 中,总体目标是将该文件导出为 Parquet 格式并进一步处理它在 Pandas 或 Dask DataFrame 中。我如何在 pyarrow 中为 csv 文件指定列名和列数据类型?
我已经考虑过将 header 附加到 csv 文件。这强制完全重写文件,这看起来像是不必要的开销。据我所知,pyarrow 提供了用于定义特定列的 dtype 的模式,但是文档缺少将 csv 文件转换为箭头时这样做的具体示例 table.
假设此 csv 文件仅包含两列 "A" 和 "B" 作为简单示例。 我当前的代码如下所示:
import numpy as np
import pandas as pd
import pyarrow as pa
df_with_header = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
print(df_with_header)
df_with_header.to_csv("data.csv", header=False, index=False)
df_without_header = pd.read_csv('data.csv', header=None)
print(df_without_header)
opts = pa.csv.ConvertOptions(column_types={'A': 'int8',
'B': 'int8'})
table = pa.csv.read_csv(input_file = "data.csv", convert_options = opts)
print(table)
如果我打印出最后的 table,它不会更改列的名称。
pyarrow.Table
1: int64
3: int64
我现在如何更改加载的列名和数据类型?是否还有可能例如传递包含名称及其数据类型的字典?
您可以为列指定类型覆盖:
fp = io.BytesIO(b'one,two,three\n1,2,3\n4,5,6')
fp.seek(0)
table = csv.read_csv(
fp,
convert_options=csv.ConvertOptions(
column_types={
'one': pa.int8(),
'two': pa.int8(),
'three': pa.int8(),
}
))
但在您的情况下,您没有 header,据我所知,箭头不支持此用例:
fp = io.BytesIO(b'1,2,3\n4,5,6')
fp.seek(0)
table = csv.read_csv(
fp,
parse_options=csv.ParseOptions(header_rows=0)
)
这引发了:
pyarrow.lib.ArrowInvalid: header_rows == 0 needs explicit column names
这类似于这个问题apache arrow - reading csv file