#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. Черт, тоже не работает :/