Python 如何在保存pd.DataFrame时强制使用拼花地板数据类型?

Python 如何在保存pd.DataFrame时强制使用拼花地板数据类型?,python,pandas,parquet,dask,pyarrow,Python,Pandas,Parquet,Dask,Pyarrow,有没有办法强制拼花文件将pd.DataFrame列编码为给定类型,即使该列的所有值都为空?parquet在其模式中自动分配“null”的事实阻止我将许多文件加载到单个dask.dataframe 尝试使用df.column\u name=df.column\u name.astype(sometype)强制转换pandas列无效 我为什么问这个问题 我想将许多拼花地板文件加载到单个dask.dataframe。所有文件都是使用df.to\u parquet(filename)从尽可能多的pd.D

有没有办法强制拼花文件将
pd.DataFrame
列编码为给定类型,即使该列的所有值都为空?parquet在其模式中自动分配“null”的事实阻止我将许多文件加载到单个
dask.dataframe

尝试使用
df.column\u name=df.column\u name.astype(sometype)
强制转换pandas列无效

我为什么问这个问题

我想将许多拼花地板文件加载到单个
dask.dataframe
。所有文件都是使用
df.to\u parquet(filename)
从尽可能多的
pd.DataFrame
实例生成的。所有数据帧都有相同的列,但对于某些数据帧,给定的列可能只包含空值。尝试将所有文件加载到
dask.dataframe
(使用
df=dd.read\u parquet('*.parquet')
)时,出现以下错误:

Schema in filename.parquet was different.
id: int64
text: string
[...]
some_column: double

vs

id: int64
text: string
[...]
some_column: null
重现问题的步骤

import pandas as pd
import dask.dataframe as dd
a = pd.DataFrame(['1', '1'], columns=('value',))
b = pd.DataFrame([None, None], columns=('value',))
a.to_parquet('a.parquet')
b.to_parquet('b.parquet')
df = dd.read_parquet('*.parquet')  # Reads a and b
这给了我以下信息:

ValueError: Schema in path/to/b.parquet was different. 
value: null
__index_level_0__: int64
metadata
--------
{b'pandas': b'{"index_columns": ["__index_level_0__"], "column_indexes": [{"na'
            b'me": null, "field_name": null, "pandas_type": "unicode", "numpy_'
            b'type": "object", "metadata": {"encoding": "UTF-8"}}], "columns":'
            b' [{"name": "value", "field_name": "value", "pandas_type": "empty'
            b'", "numpy_type": "object", "metadata": null}, {"name": null, "fi'
            b'eld_name": "__index_level_0__", "pandas_type": "int64", "numpy_t'
            b'ype": "int64", "metadata": null}], "pandas_version": "0.22.0"}'}

vs

value: string
__index_level_0__: int64
metadata
--------
{b'pandas': b'{"index_columns": ["__index_level_0__"], "column_indexes": [{"na'
            b'me": null, "field_name": null, "pandas_type": "unicode", "numpy_'
            b'type": "object", "metadata": {"encoding": "UTF-8"}}], "columns":'
            b' [{"name": "value", "field_name": "value", "pandas_type": "unico'
            b'de", "numpy_type": "object", "metadata": null}, {"name": null, "'
            b'field_name": "__index_level_0__", "pandas_type": "int64", "numpy'
            b'_type": "int64", "metadata": null}], "pandas_version": "0.22.0"}'}
请注意,在一种情况下,我们有
“pandas\u type”:“unicode”
,而在另一种情况下,我们有
“pandas\u type”:“empty”

没有为我提供解决方案的相关问题


如果您改用
fastparquet
,您可以实现您想要的聊天功能

import pandas as pd
import dask.dataframe as dd
a = pd.DataFrame(['1', '1'], columns=('value',))
b = pd.DataFrame([None, None], columns=('value',))
a.to_parquet('a.parquet', object_encoding='int', engine='fastparquet')
b.to_parquet('b.parquet', object_encoding='int', engine='fastparquet')

dd.read_parquet('*.parquet').compute()
给予


有趣的是,列的数据类型是float64NaN,它是作为float实现的。使用
pyarrow
有什么解决方案吗?我们遇到了类似的问题,并运行了
重新分区
(重过程但有效)最近对拼花地板的读写进行了重构,值得再试一次
   value
0    1.0
1    1.0
0    NaN
1    NaN