Dask Эквивалент pd.to_numeric - PullRequest
1 голос
/ 26 июня 2019

Я пытаюсь прочитать несколько файлов CSV, каждый около 15 ГБ, используя dask read_csv.При выполнении этой задачи dask интерпретирует определенный столбец как float, однако у него есть несколько значений строкового типа, и в дальнейшем происходит сбой, когда я пытаюсь выполнить какую-либо операцию, заявляя, что не может преобразовать строку в float.Поэтому я использовал аргумент dtype = str для чтения всех столбцов в виде строки.Теперь я хочу преобразовать конкретный столбец в числовой с ошибками = 'coerce', чтобы в этих записях содержалась строка, преобразуемая в значения NaN, а остальные - в плавающие.Не могли бы вы посоветовать, как этого можно добиться с помощью dask?

Уже пробовали: преобразование astype

import dask.dataframe as dd
df = dd.read_csv("./*.csv", encoding='utf8', 
                 assume_missing = True, 
                 usecols =col_names.values.tolist(),
                    dtype=str)
df["mycol"] = df["mycol"].astype(float)
search_df = df.query('mycol >0').compute()
ValueError: Mismatched dtypes found in `pd.read_csv`/`pd.read_table`.

+-----------------------------------+--------+----------+
| Column                            | Found  | Expected |
+-----------------------------------+--------+----------+
| mycol                             | object | float64  |
+-----------------------------------+--------+----------+

The following columns also raised exceptions on conversion:

- mycol
  ValueError("could not convert string to float: 'cliqz.com/tracking'")
#Reproducible example
import dask.dataframe as dd
df = dd.read_csv("mydata.csv", encoding='utf8', 
                 assume_missing = True)
df.dtypes #count column will appear as float but it has a couple of dirty values as string
search_df = df.query('count >0').compute() #This line will give the type conversion error
#Edit with one possible solution, but is this optimal while using dask?
import dask.dataframe as dd
import pandas as pd
to_n = lambda x: pd.to_numeric(x, errors="coerce")
df = dd.read_csv("mydata.csv", encoding='utf8', 
                 assume_missing = True,
                 converters={"count":to_n}
                )
df.dtypes 
search_df = df.query('count >0').compute() 
...