从MySQL数据库导入数据到Pandas数据框,包括列名。

93

我正在将MySQL数据库中的数据导入到Pandas数据框中。以下是我使用的代码片段:

import mysql.connector as sql
import pandas as pd

db_connection = sql.connect(host='hostname', database='db_name', user='username', password='password')
db_cursor = db_connection.cursor()
db_cursor.execute('SELECT * FROM table_name')

table_rows = db_cursor.fetchall()

df = pd.DataFrame(table_rows)

当我打印数据框时,它能正确地表示数据。但我的问题是,是否可能同时保留列名?这是一个示例输出:

                          0   1   2     3     4     5     6     7     8
0  :ID[giA0CqQcx+(9kbuSKV== NaN NaN  None  None  None  None  None  None
1  lXB+jIS)DN!CXmj>0(P8^]== NaN NaN  None  None  None  None  None  None   
2  lXB+jIS)DN!CXmj>0(P8^]== NaN NaN  None  None  None  None  None  None   
3  lXB+jIS)DN!CXmj>0(P8^]== NaN NaN  None  None  None  None  None  None   
4  lXB+jIS)DN!CXmj>0(P8^]== NaN NaN  None  None  None  None  None  None   

我想要做的是保留列名,用它来替代Pandas列索引。例如,列索引0可以被替换为"MySQL"表中的"First_column"列名。有没有好的方法来实现这个?或者是否有比我更有效的方法将数据从MySQL导入到Pandas数据框中?


1
为什么不使用pd.read_sql() - MaxU - stand with Ukraine
19
这里涉及到的问题与SQLalchemy无关,而是与MySQL数据库有关,不同于重复问题中所提出的。pd.read_sql()不支持MySQL连接。这个问题不应该被标记为重复。要回答这个查询: df = pd.DataFrame(table_rows, columns=db_cursor.column_names) 将会执行所需的操作。 - kneewarp
1
@kneewarp,你应该把这个作为答案发布。被接受的答案在MySQL连接中不起作用,而这正是OP所要求的。 - kainC
截至2022年,我们发现在MacOS上使用pandas.read_sql()安装sqlalchemy+pymysql+mysqlclient存在问题。您必须先在操作系统上手动安装mysql或mysqlclient。因此,我认为使用mysql-connector-python是更好的选择。 - Z.Wei
1个回答

195

我认为使用 pandas 从你的 MySQL 服务器中读取数据会更加高效:

from sqlalchemy import create_engine
import pandas as pd

db_connection_str = 'mysql+pymysql://mysql_user:mysql_password@mysql_host/mysql_db'
db_connection = create_engine(db_connection_str)

df = pd.read_sql('SELECT * FROM table_name', con=db_connection)

这也应该处理列名...


2
在我的情况下,这个方法可行,但在关闭连接之前无法直接查询表:db_connection.close() - HaMi
根据https://dev59.com/z57ha4cB1Zd3GeqPrPa9。我决定使用MySQLdb,如何在MySQLdb中实现这一点? - chaikov
1
一个人也可以使用mysql.connect来连接数据库(而不是导入两个包sqlalchemy和pymysql),然后可以使用pd.read_sql函数。 - Yogesh Awdhut Gadade
1
db_connection.close() 出现错误,无法连接到 MySQL 服务器。 - Aman Khandelwal
3
关闭连接:>>> db_connection.dispose() - Brad123
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接