我仍在学习 Dask 来使用数据库:
我有一个 Dask 数据帧,成功从本地 sql DB 复制,如下所示:
ddf_authorized = dd.read_sql_table("cz_transaction_authorized", "mysql+pymysql://user_account:[email protected]:3306/user","id")
ddf_mobileuser = dd.read_sql_table("cz_mobile_user", "mysql+pymysql://user_account:[email protected]:3306/user","id")
ddf_users = dd.read_sql_table("users", "mysql+pymysql://user_account:[email protected]:3306/user","id")
ddf_reader = dd.read_sql_table("reader", "mysql+pymysql://user_account:[email protected]:3306/user","id")
ddf_mid = dd.read_sql_table("cz_mid","mysql+pymysql://user_account:[email protected]:3306/user","id")
我知道我的本地数据库中有很多 NA 值,特别是事务授权的数据库,有 140 万行,所以当我调用
ddf_authorized.head()
只是想检查我的 Dataframe 时,它给了我这个错误
ValueError: Cannot convert non-finite values (NA or inf) to integer
我确实尝试使用
fillna()
来填充 NA 值,但错误仍然存在,如下所示:
for x in list(ddf_authorized.columns.values):
if ddf_authorized[x].dtype != 'O':
ddf_authorized[x] = ddf_authorized[x].fillna(0)
else:
ddf_authorized[x] = ddf_authorized[x].fillna("-")
有没有更安全的方法或事情来检查带有这些 NA 值的 Dask Dataframes?因为我熟悉 Pandas 并且对 NA 值没有任何问题,并且必须在 Dask 中看到这个问题..
我尝试将数据库中的一张表导出到 csv 文件中,并且它不受 NA 值的影响,这是 CSV 文件http://www.sharecsv.com/s/147ba0bb507bb6dcc14a3a6c91af4eef/reader_table.csv
然后,我尝试用 dask.read_csv 来读取它
x = dd.read_csv("C:/Users/User/Desktop/Data Science Journey/My Cashlez Work Assets/Insight 16 Desember/reader_table.csv")
如果我运行
x.head()
,它会成功运行,没有任何错误,但如果我使用 y.head() 直接从数据库读取它,则不起作用,如下所示:
y = dd.read_sql_table("reader", "mysql+pymysql://user_account:[email protected]:3306/user","id")
y["id"] = ddf_reader["reader_id"].astype('int64')
y["devicetype_fk"] = ddf_reader["devicetype_fk"].astype('O')
y["serial_number"] = ddf_reader["serial_number"].astype('O')
所以也许这是一个
read_sql_table()
的问题?
Dask 可能推断出错误的数据类型:它通过查看顶部值来假定整数列。然后你遇到了意外的
NA
无法转换为int的问题。使用 Pandas 不会出现这些问题,因为在这种情况下,整个列都会被考虑来确定数据类型。
尝试使用 read_sql_table 的
meta
关键字显式指定列的数据类型(例如 float(对于具有 nans 和 infs 的数字类型)或 object(对于任意混合类型))。
您可以将空的 pandas df 作为元传递,例如
meta=pd.DataFrame(columns=['col1', 'col2']).astype({'col1': float})
您明确定义所需的数据类型
{'col1': float}
。默认是对象。这似乎需要 npartitions
的规范(作为 read_sql_table
的关键字参数),您可能无论如何都想这样做,以调整 dask 性能。
我在写入表格时出现此错误。字段为 int 且 NULL。无法修复。
已经尝试过 .asdtype 对象并不断发生。我认为不是 dask,是何时计算回 pandas 以输入数据库并且某些内容处理不当