Значения NaN, не замененные во фрейме данных dask

#python #pandas #dataframe #dask #nan

Вопрос:

Я пытаюсь преобразовать фрейм данных dask в фрейм данных pandas со следующим кодом:

 import dask.dataframe as dd
uri = "mysql pymysql://myUser:myPassword@myHost:myPort/myDatabase"
dataframe = dd.read_sql_table("myTable", uri, "id", columns=["id", "name", "type_id"])
df = dataframe.fillna(0)
print(len(df.index))
 

Однако я сталкиваюсь со следующей ошибкой:

 Traceback (most recent call last):
  File "tmp.py", line 5, in <module>
    print(len(df.index))
  File "/home/user/.local/lib/python3.7/site-packages/dask/dataframe/core.py", line 593, in __len__
    len, np.sum, token="len", meta=int, split_every=False
  File "/home/user/.local/lib/python3.7/site-packages/dask/base.py", line 288, in compute
    (result,) = compute(self, traverse=False, **kwargs)
  File "/home/user/.local/lib/python3.7/site-packages/dask/base.py", line 570, in compute
    results = schedule(dsk, keys, **kwargs)
  File "/home/user/.local/lib/python3.7/site-packages/dask/threaded.py", line 87, in get
    **kwargs
  File "/home/user/.local/lib/python3.7/site-packages/dask/local.py", line 517, in get_async
    raise_exception(exc, tb)
  File "/home/user/.local/lib/python3.7/site-packages/dask/local.py", line 325, in reraise
    raise exc
  File "/home/user/.local/lib/python3.7/site-packages/dask/local.py", line 223, in execute_task
    result = _execute_task(task, data)
  File "/home/user/.local/lib/python3.7/site-packages/dask/core.py", line 121, in _execute_task
    return func(*(_execute_task(a, cache) for a in args))
  File "/home/user/.local/lib/python3.7/site-packages/dask/utils.py", line 35, in apply
    return func(*args, **kwargs)
  File "/home/user/.local/lib/python3.7/site-packages/dask/dataframe/io/sql.py", line 232, in _read_sql_chunk
    return df.astype(meta.dtypes.to_dict(), copy=False)
  File "/home/user/.local/lib/python3.7/site-packages/pandas/core/generic.py", line 5683, in astype
    col.astype(dtype=dtype[col_name], copy=copy, errors=errors)
  File "/home/user/.local/lib/python3.7/site-packages/pandas/core/generic.py", line 5698, in astype
    new_data = self._data.astype(dtype=dtype, copy=copy, errors=errors)
  File "/home/user/.local/lib/python3.7/site-packages/pandas/core/internals/managers.py", line 582, in astype
    return self.apply("astype", dtype=dtype, copy=copy, errors=errors)
  File "/home/user/.local/lib/python3.7/site-packages/pandas/core/internals/managers.py", line 442, in apply
    applied = getattr(b, f)(**kwargs)
  File "/home/user/.local/lib/python3.7/site-packages/pandas/core/internals/blocks.py", line 625, in astype
    values = astype_nansafe(vals1d, dtype, copy=True)
  File "/home/user/.local/lib/python3.7/site-packages/pandas/core/dtypes/cast.py", line 868, in astype_nansafe
    raise ValueError("Cannot convert non-finite values (NA or inf) to integer")
ValueError: Cannot convert non-finite values (NA or inf) to integer
 

Таблица, которую я использую, имеет следующую структуру (получена только с использованием панд):

 id    name      type_id
-------------------------
2     name_2    3.0
3     name_3    3.0
4     name_4    1.0
6     name_6    NaN
7     name_7    2.0
...
 

Я попробовал тот же код, не извлекая столбец «type_id», и он работает так, как ожидалось.

Чего я не понимаю, так это почему значения NaN не заменяются на «0», так как я использую fillna(0) функцию перед попыткой преобразовать фрейм данных.

Если я посмотрю на свою базу данных с помощью phpmyadmin, значения pandas » NaN «будут» НУЛЕВЫМИ » значениями.

Как значения NaN не заменяются на «0»

Ответ №1:

При использовании df = dataframe.fillna(0) вы инструктируете заполнять nan во всех столбцах, что может быть проблематично. Может сработать явное указание столбцов с помощью nan:

 df = dataframe.copy()
df["type_id"] = df["type_id"].astype('float').fillna(0)
 

Другой вариант-попробовать dd.to_numeric :

 df["type_id"] = dd.to_numeric(df["type_id"], errors="coerce").fillna(0)
 

Комментарии:

1. Я пытался, но, к сожалению, у меня та же ошибка

2. Все та же ошибка

3. Еще одна попытка…

4. Черт, тоже не работает :/