Есть ли способ заставить файл паркета кодировать столбец pd.DataFrame
в качестве заданного типа, даже если все значения для столбца являются нулевыми? Тот факт, что паркет автоматически присваивает «null» в своей схеме, не позволяет мне загружать много файлов в один dask.dataframe
.
Попытка привести колонну панд с помощью df.column_name = df.column_name.astype(sometype)
не сработала.
Почему я спрашиваю это
Я хочу загрузить много файлов паркета в один dask.dataframe
. Все файлы были сгенерированы из стольких экземпляров pd.DataFrame
с использованием df.to_parquet(filename)
. Все кадры данных имеют одинаковые столбцы, но для некоторых данный столбец может содержать только нулевые значения. При попытке загрузить все файлы в dask.dataframe
(используя df = dd.read_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_type": "unicode"
, а в другом - "pandas_type": "empty"
.
Смежные вопросы, которые не дали мне решения