0

我需要使用Python 中的odo库将 MySQL 数据库中的数据提取到 Pandas 数据框中。Odo 的文档仅提供有关传递表名以获取数据的信息,但如何传递从数据库中获取所需数据的 SQL 查询字符串。

以下代码有效:

进口奥多

将熊猫导入为 pd

data = odo('mysql+pymysql://username:{0}@localhost/dbname::{1}'.format('password', 'table_name'), pd.DataFrame)

但是如何传递 SQL 字符串而不是表名。因为我需要加入多个其他表来提取所需的数据。

4

1 回答 1

0

模块不支持将字符串直接传递给 odo。使用列出的工具可以通过三种方法移动数据。

首先,创建一个 sql 查询作为字符串并使用以下命令读取:

data = pandas.read_sql_query(sql, con, index_col=None,
                             coerce_float=True, params=None,
                             parse_dates=None, chunksize=None)[source]

参考http://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.read_sql_query.html#pandas.read_sql_query

其次,使用 odo 方法需要在字典中运行查询,然后在 odo(source, destination) 结构中使用字典。

cursor.execute(sql)
results = db.engine.execute(sql)

data = odo(results, pd.DataFrame)

参考https://media.readthedocs.org/pdf/odo/latest/odo.pdf的第 30 页

ref如何在 SQLAlchemy-flask 应用程序中执行原始 SQL

Python 中的ref cursor.fetchall() 与 list(cursor)

最后,为了提高执行速度,可以考虑在结果中为每个结果附加 pandas 数据框。

result = db.engine.execute(sql).fetchone()

data = pd.DataFrame(index=index, columns=list('AB'))
data = df_.fillna(0) # with 0s rather than NaNs

while result is not None:
    dataappend = pd.DataFrame(result, columns=list('AB'))
    data.append(dataappend)
    result = db.engine.execute(sql).fetchone()

参考https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html

ref创建一个空的 Pandas DataFrame,然后填充它?

于 2017-10-13T00:53:19.147 回答