Dask Dataframes 不能容忍其中的 NA 值吗?出现 ValueError,无法转换非有限值

问题描述 投票:0回答:2

我仍在学习 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()
的问题?

python mysql dask
2个回答
1
投票

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 性能。


0
投票

我在写入表格时出现此错误。字段为 int 且 NULL。无法修复。

已经尝试过 .asdtype 对象并不断发生。我认为不是 dask,是何时计算回 pandas 以输入数据库并且某些内容处理不当

© www.soinside.com 2019 - 2024. All rights reserved.