Dask数据框是否不容许NA值?收到ValueError,无法转换非有限值

时间:2019-12-17 08:52:36

标签: python mysql dask

我仍在学习Dask以使用数据库:

我有一个Dask数据帧,可以成功从我的本地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数据框是否有更安全的方法或想法?因为我很熟悉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: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()的问题?

1 个答案:

答案 0 :(得分:1)

Dask可能推断出错误的数据类型:它通过查看顶部的值来假定一个整数列。然后,您遇到了无法将意外的NA转换为int的问题。您不会在Pandas上遇到这些问题,因为在那种情况下,整个列都将用于确定数据类型。

尝试使用meta keyword of read_sql_table显式指定列的dtypes(例如float(对于带有nans和infs的数字类型)或object(对于任意混合的类型))。

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

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

在其中显式定义所需的dtypes {'col1': float}。默认为对象。这似乎需要规范npartitions(作为read_sql_table的关键字参数),您可能仍然想这样做,以调整性能。