由于 inf 值无法将 pandas df 上传到 mysql

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

我有一个具有无穷大值(inf)的 excel 文件,我总是遇到编程错误将其上传到 MySQL DB

ProgrammingError                          Traceback (most recent call last)
~/.local/lib/python3.8/site-packages/sqlalchemy/engine/base.py in _execute_context(self, dialect, constructor, statement, parameters, execution_options, *args, **kw)
   1750                 if not evt_handled:
-> 1751                     self.dialect.do_executemany(
   1752                         cursor, statement, parameters, context

~/.local/lib/python3.8/site-packages/sqlalchemy/dialects/mysql/mysqldb.py in do_executemany(self, cursor, statement, parameters, context)
    196     def do_executemany(self, cursor, statement, parameters, context=None):
--> 197         rowcount = cursor.executemany(statement, parameters)
    198         if context is not None:

~/.local/lib/python3.8/site-packages/pymysql/cursors.py in executemany(self, query, args)
    172             assert q_values[0] == "(" and q_values[-1] == ")"
--> 173             return self._do_execute_many(
    174                 q_prefix,

~/.local/lib/python3.8/site-packages/pymysql/cursors.py in _do_execute_many(self, prefix, values, postfix, args, max_stmt_length, encoding)
    201         for arg in args:
--> 202             v = values % escape(arg, conn)
    203             if isinstance(v, str):

~/.local/lib/python3.8/site-packages/pymysql/cursors.py in _escape_args(self, args, conn)
    108         elif isinstance(args, dict):
--> 109             return {key: conn.literal(val) for (key, val) in args.items()}
    110         else:

~/.local/lib/python3.8/site-packages/pymysql/cursors.py in <dictcomp>(.0)
    108         elif isinstance(args, dict):
--> 109             return {key: conn.literal(val) for (key, val) in args.items()}
    110         else:

~/.local/lib/python3.8/site-packages/pymysql/connections.py in literal(self, obj)
    516         """
--> 517         return self.escape(obj, self.encoders)
    518 

~/.local/lib/python3.8/site-packages/pymysql/connections.py in escape(self, obj, mapping)
    509             return ret
--> 510         return converters.escape_item(obj, self.charset, mapping=mapping)
    511 

~/.local/lib/python3.8/site-packages/pymysql/converters.py in escape_item(val, charset, mapping)
     24     else:
---> 25         val = encoder(val, mapping)
     26     return val

~/.local/lib/python3.8/site-packages/pymysql/converters.py in escape_float(value, mapping)
     59     if s in ("inf", "nan"):
---> 60         raise ProgrammingError("%s can not be used with MySQL" % s)
     61     if "e" not in s:

ProgrammingError: inf can not be used with MySQL

我试过的

我尝试先将 inf 转换为 0,但它更改了我不想要的数据。然后我将 inf 转换为 3 个小数点

df = df.replace(np.nan, 0)
df = np.round(df, decimals = 3)

我还替换了可能具有 inf 值但没有任何效果的列的类型。

df["col1"]=df["col1"].astype("float")
df["col2"]=df["col2"].astype("float")

错误后我也检查了 df,但没有 inf 值,但 pandas 也给出了错误。

Checking of inf values (Code)

mysql python-3.x pandas mysql-python pymysql
© www.soinside.com 2019 - 2024. All rights reserved.