Dask 数据帧是否不能容忍其中的 NA 值? 获取 ValueError,无法转换非有限值



我还在学习Dask使用数据库:

我有一个 Dask 数据帧,它成功地从我的本地 sql 数据库复制,如下所示:

ddf_authorized = dd.read_sql_table("cz_transaction_authorized", "mysql+pymysql://user_account:mysqlworld@127.0.0.1:3306/user","id")
ddf_mobileuser = dd.read_sql_table("cz_mobile_user", "mysql+pymysql://user_account:mysqlworld@127.0.0.1:3306/user","id")
ddf_users = dd.read_sql_table("users", "mysql+pymysql://user_account:mysqlworld@127.0.0.1:3306/user","id")
ddf_reader = dd.read_sql_table("reader", "mysql+pymysql://user_account:mysqlworld@127.0.0.1:3306/user","id")
ddf_mid = dd.read_sql_table("cz_mid","mysql+pymysql://user_account:mysqlworld@127.0.0.1:3306/user","id")

我知道我的本地数据库中有很多 NA 值,尤其是事务授权的数据库,它是 140 万行,所以当我调用ddf_authorized.head()只是想检查我的数据帧时,它给了我这个错误

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 数据帧? 因为我熟悉熊猫并且对 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:mysqlworld@127.0.0.1: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关键字来显式指定列的 dtype(例如 float(对于带有 nans 和 infs 的数字类型(或对象(对于任意混合类型((。

您可以将空熊猫 df 作为元传递,例如

meta=pd.DataFrame(columns=['col1', 'col2']).astype({'col1': float})

在其中显式定义所需的 dtype{'col1': float}.默认值为对象。这似乎需要npartitions的规范(作为read_sql_table的关键字参数(,您可能无论如何都想这样做来调整 dask 性能。

相关内容

最新更新