pandas 讀mysql數據庫(整個表或者表的指定列)


問題1:如何從數據庫中讀取整個表數據到DataFrame中?

首先,來看很容易想到的的辦法

 1     def read_table_by_name(self, table_name):
 2         """
 3         讀取table_name表
 4         :return: dataframe對象 所有的評價對象及其數據        
 5         """
 6         field_list = []    # target表的所有字段的列表
 7         field_data = []    # 存放某一字段的所有數據
 8         frame_data = pd.DataFrame()
 9 
10         self._cursor = self._connect.cursor()
11         sql = "select COLUMN_NAME from information_schema.COLUMNS where table_name = '%s'"
12         self._cursor.execute(sql % table_name)
13         results = self._cursor.fetchall()
14         for row in results:
15             field_list.append(row[0])
16 
17         name_sql = "select %s from %s"
18         i = 0
19         for field in field_list:
20             self._cursor.execute(name_sql % (field, table_name))
21             column_data = self._cursor.fetchall()
22             field_data.clear()
23             for j in range(len(column_data)):
24                 field_data.append(column_data[j][0])
25             frame_data.insert(i, field, field_data)  # frame_data 插入數據
26 
27             i += 1
28 
29         return frame_data    

看起來,十分麻煩。那么有沒有簡單的辦法呢?當然有,目前我已知的有以下幾種:

1:使用pandas.io.sql模塊中sql.read_sql_table(table_name,conn)直接將一個table轉到dataframe中

1 import pandas as pd
2 from sqlalchemy import create_engine
3 engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test')
4 result = pd.io.sql.read_sql_table('employee', engine)
5 print(type(result), '\n', result)

注意:read_sql_table 僅支持 SQLAlchemy 連接

輸出結果如下:

2:使用pandas.io.sql模塊中的sql.read_sql_query(sql_str,conn)或者sql.read_sql(sql_str,conn),效果相同,都使用sql語句

1 import pandas as pd
2 import pymysql
3 from sqlalchemy import create_engine
4 # conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='test')
5 engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test')
6 sql_str = 'select * from employee'
7 result = pd.io.sql.read_sql_query(sql_str, engine)
8 print(type(result), '\n', result)
1 import pandas as pd
2 import pymysql
3 from sqlalchemy import create_engine
4 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='test')
5 # engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test')
6 sql_str = 'select * from employee'
7 result = pd.io.sql.read_sql_query(sql_str, conn)
8 print(type(result), '\n', result)

注意:read_sql_query 不僅支持 SQLAlchemy 連接,pymysql也可以

 

問題2:如何從數據庫中讀取表的指定列的數據到DataFrame中?

先來看比較容易想到的辦法:

 1 def read_indexs_by_index(self, table_name,  index_list):
 2         """
 3         根據選擇的指標名列表讀取table_name表
 4         :param self: 
 5         :param table_name: 表名
 6         :param index_list: 指定列的列表
 7         :return: 
 8         """
 9         index_data = []
10         frame_data = pd.DataFrame()
11         sql = "select %s from %s"
12         i = 0
13         for index in index_list:
14             self._cursor.execute(sql % (index, table_name))
15             column_data = self._cursor.fetchall()
16             index_data.clear()
17             for j in range(len(column_data)):
18                 index_data.append(float(column_data[j][0]))
19             frame_data.insert(i, index, index_data)  # frame_data 插入數據
20             i += 1
21 
22         return frame_data

再看使用使用 pd.io.sql.read_sql_query模塊的方法:

 1 def read_indexs_by_index(self, table_name, index_list):
 2         """
 3         根據選擇的指標名列表讀取table_name表
 4         :param self:
 5         :param table_name:
 6         :param index_list:
 7         :return:
 8         """
 9         sql = "select * from %s"
10         df = pd.io.sql.read_sql_query((sql % table_name), self._connect)
11 
12         data_frame = df.loc[list(range(0, df.shape[0])), index_list]  # df.loc[:,index_list]也可以
13 
14         return data_frame

只需要四行😁

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM