После обработки большого набора данных с использованием Pandas/Dask я сохранил результирующий фрейм данных в файл csv.
Когда я пытаюсь прочитать выходной CSV с использованием Dask, по умолчанию все типы данных являются объектами. Всякий раз, когда я пытаюсь преобразовать их, используя обычные методы (например, определение типов данных при чтении или переназначении их после чтения), я продолжаю получать ошибки в отношении преобразования, как показано ниже:
# ATTEMPT 1
import dask.dataframe as dd
header = ['colA', 'colB', ...]
dtypes = {'colA' : 'float', ...}
df = dd.read_csv('file.csv', names=header, dtype=types)
> TypeError: Cannot cast array from dtype('O') to dtype('float64') according to the rule 'safe'
> ...
> ValueError: could not convert string to float: 'colA'
-----------------------------------------------------------------------------------
# ATTEMPT 2
import dask.dataframe as dd
header = ['colA', 'colB', ...]
df = dd.read_csv('file.csv', names=header)
df['colA'] = df['colA'].astype(str).astype(float)
> ...
> File "/home/routar/anaconda3/lib/python3.6/site-packages/pandas/core/dtypes/cast.py", line 730, in astype_nansafe
> ValueError: could not convert string to float: 'colA'
Все атрибуты в исходном фрейме данных (до преобразования в CSV) являются ints/float, поэтому преобразование на 100% возможно. Я также уверен, что значения действительны.
Я предполагаю, что это имеет какое-то отношение к безопасной политике Python в отношении конверсий данных.
Есть ли обходной путь для этого или любого способа принудительного преобразования?
Когда вы читаете dataframe из csv, используя name names=header
, вы получаете имена столбцов в первой строке вашего фрейма.
Вот почему вы получаете ошибку
ValueError: не удалось преобразовать строку в float: 'colA'
Потому что colA
- это первое значение вашего столбца.
Поэтому просто добавьте header=0
param в read_csv
(чтобы явно использовать первую строку как имена столбцов), чтобы исправить проблему:
df = dd.read_csv('file.csv', names=header, dtype=types, header=0)