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

2024-10-03 19:29:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我仍在学习如何使用数据库:

我有一个Dask dataframes,它成功地从本地sql DB复制,如下所示:

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值的问题,而且不得不在达斯克看到这个问题。。你知道吗

更新:我正在研究根本原因

我试着将数据库中的一个表导出到csv文件中,它没有NA值,这里是csv文件http://www.sharecsv.com/s/147ba0bb507bb6dcc14a3a6c91af4eef/reader_table.csv

然后,我试着读它dask.read\u 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()直接从DB读取它,它就不工作了,如下所示:

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()的问题?你知道吗


Tags: csvidreadsqlmysqltableaccountdd
1条回答
网友
1楼 · 发布于 2024-10-03 19:29:33

Dask可能推断出错误的数据类型:它通过查看顶值来假定一个整数列。然后您会遇到这样一个问题:意外的NA无法转换为int。你知道吗

尝试使用^{} keyword of read_sql_table显式指定列的数据类型(例如float(对于带有nans和infs的数字类型)或object(对于任意混合类型))。你知道吗

您可以传递一个空的df作为meta,例如

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

其中显式定义所需的数据类型{'col1': float}。默认值为object。这似乎需要指定npartitions(作为read_sql_table的关键字参数)来优化dask性能。你知道吗

相关问题 更多 >