python - 保存到镶木地板文件时如何使用新的 Int64 熊猫对象
问题描述
我正在使用 Python (Pandas) 将数据从 CSV 转换为 Parquet,以便稍后将其加载到 Google BigQuery 中。我有一些包含缺失值的整数列,因为 Pandas 0.24.0 我可以将它们存储为 Int64 dtype。
有没有办法在镶木地板文件中使用 Int64 dtype?对于缺少值的整数,我找不到干净的解决方案(因此它们在 BigQuery 中保持为 INTEGER)。
我尝试将其直接导入 BigQuery 并得到与使用 Pandas 转换为镶木地板时相同的错误(如下所示。)
导入包含缺失值的 int 列的 CSV:
import pandas as pd
df = pd.read_csv("docs/test_file.csv")
print(df["id"].info())
id 8 非空 float64
该行作为 float64 导入。我将类型更改为 Int64:
df["id"] = df["id"].astype('Int64')
print(df["id"].info())
id 8 非空 Int64
然后我尝试保存到镶木地板:
df.to_parquet("output/test.parquet")
错误:
pyarrow.lib.ArrowTypeError: ('没有传递 numpy.dtype 对象','转换失败的列 ID 类型为 Int64')
解决方案
目前在https://github.com/googleapis/google-cloud-python/issues/7702上存在一个支持来自 google-cloud-bigquery 的新 Int64 列的未解决问题。
同时,我建议使用 object dtype。在 google-cloud-bigquery 版本 1.13.0 中,您可以指定所需的 BigQuery 架构,并且库将在 parquet 文件中使用所需的类型。
# Schema with all scalar types.
table_schema = (
bigquery.SchemaField("int_col", "INTEGER"),
)
num_rows = 100
nulls = [None] * num_rows
dataframe = pandas.DataFrame(
{
"int_col": nulls,
}
)
table_id = "{}.{}.load_table_from_dataframe_w_nulls".format(
Config.CLIENT.project, dataset_id
)
job_config = bigquery.LoadJobConfig(schema=table_schema)
load_job = Config.CLIENT.load_table_from_dataframe(
dataframe, table_id, job_config=job_config
)
load_job.result()
推荐阅读
- asp.net-core - Asp.net Core Quartz 作业调用控制器方法,但上下文
- r - 如何可视化 R 中单行上的点?
- reactjs - reactjs 卸载组件,病毒式
- node.js - 如何将 Svelte 构建到 Docker 映像中
- r - 不可能在 R 中使用 ggplotly 的透明背景?
- xml - 如何在 sap.ui.table 中取消排序的列?
- javascript - 在数组上,长度是预先计算的还是每次通过迭代计算的?
- ssas-tabular - 表格分区如何影响最终用户?
- c++ - gmock SetArgPointee<> 传递指针的问题
- ios - SwiftUI - LazyVGrid 调整大小