pandas 的讀寫函數簡表
讀取函數 | 寫入函數 | 解釋 |
read_clipboard | to_clipboard | 從剪貼板中讀取文本並傳遞給read_table |
read_csv | to_csv | 將CSV(逗號分隔)文件讀入DataFrame |
read_excel | to_excel | Excel表格 |
read_sql | to_sql | |
read_pickle | to_pickle | |
read_json | to_json | |
read_msgpack | to_msgpack | |
read_stata | to_stata | |
read_gbq | to_gbq | 從Google BigQuery加載數據 |
read_hdf | to_hdf | |
read_html | to_html | |
read_parquet | to_parquet | |
read_feather | to_feather |
1、多年以來,人們已習慣於文本文件的讀寫,特別是列表形式的數據。如果文件每一行的多 個元素是用逗號隔開的,
則這種格式叫作CSV,這可能是最廣為人知和最受歡迎的格式。
2、其他由空格或制表符分隔的列表數據通常存儲在各種類型的文本文件中(擴展名一般 為.txt )。
3、因此這種文件類型是最常見的數據源,它易於轉錄和解釋。pandas的下列函數專門用來處理 這種文件類型:read_csv、read_table、to_csv。
常用數據的讀取
1 import pandas as pd 2
3 csvframe = pd.read_csv('pandas_data_test\myCSV_01.csv') 4 print(csvframe, "\n-----*-----") 5 csvframe1 = pd.read_table('pandas_data_test\myCSV_01.csv',sep=',') 6 print(csvframe1, "\n-----*-----") 7 csvframe2 = pd.read_csv('pandas_data_test\myCSV_02.csv',header=None) # 設置header為無,就不會用數據充當表頭,此時添加默認表頭
8 print(csvframe2, "\n-----*-----") 9 csvframe20 = pd.read_csv('pandas_data_test\myCSV_02.csv',names=['white','red','blue','green','animal']) # 指定表頭
10 print(csvframe20, "\n-----*-----") 11
12 csvframe30 = pd.read_csv('pandas_data_test\myCSV_03.csv') 13 print(csvframe30, "\n-----*-----") 14 csvframe31 = pd.read_csv('pandas_data_test\myCSV_03.csv',index_col=['color','status']) #等級索引
15 print(csvframe31, "\n-----*-----") 16
17 txtframe4 = pd.read_table('pandas_data_test\ch05_04.txt',sep='\s+') # 根據正則解析
18 print(txtframe4, "\n-----*-----") 19 txtframe5 = pd.read_table('pandas_data_test\ch05_05.txt',sep=r'\D+',header=None,engine='python') 20 print(txtframe5, "\n-----*-----") 21 # 使用skiprows選項,可以排除多余的行。把要排除的行的行號放到數組中,賦給該選項即可。
22 txtframe6 = pd.read_table('pandas_data_test\ch05_06.txt',sep=',',skiprows=[0,1,3,6]) 23 print(txtframe6) 24 Out[1]: 25 white red blue green animal 26 0 1 5 2 3 cat 27 1 2 7 8 5 dog 28 2 3 3 6 7 horse 29 3 2 2 8 3 duck 30 4 4 4 2 1 mouse 31 5 4 4 2 1 mou 32 -----*-----
33 white red blue green animal 34 0 1 5 2 3 cat 35 1 2 7 8 5 dog 36 2 3 3 6 7 horse 37 3 2 2 8 3 duck 38 4 4 4 2 1 mouse 39 5 4 4 2 1 mou 40 -----*-----
41 0 1 2 3 4
42 0 1 5 2 3 cat 43 1 2 7 8 5 dog 44 2 3 3 6 7 horse 45 3 2 2 8 3 duck 46 4 4 4 2 1 mouse 47 -----*-----
48 white red blue green animal 49 0 1 5 2 3 cat 50 1 2 7 8 5 dog 51 2 3 3 6 7 horse 52 3 2 2 8 3 duck 53 4 4 4 2 1 mouse 54 -----*-----
55 color status iteml item2 item3 56 0 black up 3 4 6
57 1 black down 2 6 7
58 2 white up 5 5 5
59 3 white down 3 3 2
60 4 white left 1 2 1
61 5 red up 2 2 2
62 6 red down 1 1 4
63 -----*-----
64 iteml item2 item3 65 color status 66 black up 3 4 6
67 down 2 6 7
68 white up 5 5 5
69 down 3 3 2
70 left 1 2 1
71 red up 2 2 2
72 down 1 1 4
73 -----*-----
74 white red blue green 75 0 1 5 2 3
76 1 2 7 8 5
77 2 3 3 6 7
78 -----*-----
79 0 1 2
80 0 0 123 122
81 1 1 124 321
82 2 2 125 333
83 -----*-----
84 white red blue green animal 85 0 1 5 2 3 cat 86 1 2 7 8 5 dog 87 2 3 3 6 7 horse 88 3 2 2 8 3 duck 89 4 4 4 2 1 mouse
從TXT文件讀取部分數據
1 print(csvframe2, "\n-----*-----") 2 # nrows=2指定要獲取的行數,skiprows=[2]刪除對應行
3 csvfram20 = pd.read_csv('pandas_data_test\myCSV_02.csv',skiprows=[2],nrows=2,header=None) 4 print(csvfram20) 5 Out[2]: 6 0 1 2 3 4
7 0 1 5 2 3 cat 8 1 2 7 8 5 dog 9 2 3 3 6 7 horse 10 3 2 2 8 3 duck 11 4 4 4 2 1 mouse 12 -----*-----
13 0 1 2 3 4
14 0 1 5 2 3 cat 15 1 2 7 8 5 dog
另外一項既有趣又很常用的操作是切分想要解析的文本,然后遍歷各個部分,逐一對其執行 某一特定操作。
例如,對於一列數字,每隔兩行取一個累加起來,最后把和插人到Series對象中„這個小例 子理解起來很簡單,
也沒有實際應用價值,但是一旦領會了其原理,你就能將其用到更加復雜的情況。
1 csvframe1 = pd.read_table('pandas_data_test\myCSV_01.csv',sep=',') 2 print(csvframe1, "\n-----*-----") 3 out = pd.Series() 4 pieces = pd.read_csv('pandas_data_test\myCSV_01.csv',chunksize=4) # chunksize參數決定了每部分分割的行數
5 i = 0 6 for piece in pieces: 7 print(piece['white']) 8 out.at[i] = piece['white'].sum() 9 i += 1
10 print(out, "\n-----*-----") 11 Out[3]: 12 white red blue green animal 13 0 1 5 2 3 cat 14 1 2 7 8 5 dog 15 2 3 3 6 7 horse 16 3 2 2 8 3 duck 17 4 4 4 2 1 mouse 18 5 4 4 2 1 mou 19 -----*-----
20 0 1
21 1 2
22 2 3
23 3 2
24 Name: white, dtype: int64 25 4 4
26 5 4
27 Name: white, dtype: int64 28 0 8
29 1 8
30 dtype: int64
往CSV文件寫入數據
1 print(csvframe1) 2 print(csvframe1.to_csv('pandas_data_test\ch05_07.csv')) 3 # 使用index和 header選項,把它們的值設置為False,可取消默認寫入index和header
4 print(csvframe1.to_csv('pandas_data_test\ch05_07b.csv',index =False,header=False)) 5 print(csvframe30.to_csv('pandas_data_test\ch05_08.csv')) 6 # 可以用to_csv()函數的na_rep選項把空字段替換為你需要的值。常用值有NULL、0和NaN
7 print(csvframe30.to_csv('pandas_data_test\ch05_09.csv',na_rep="空")) 8 Out[4]: 9 white red blue green animal 10 0 1 5 2 3 cat 11 1 2 7 8 5 dog 12 2 3 3 6 7 horse 13 3 2 2 8 3 duck 14 4 4 4 2 1 mouse 15 5 4 4 2 1 mou 16 None 17 None 18 None 19 None
進入文件夾我們可以看到相應的文件:
讀寫HTML文件
1 frame = pd.DataFrame(np.arange(4).reshape(2,2)) 2 print(frame.to_html()) 3 frame2 = pd.DataFrame( np.random.random((4,4)),index = ['white','black','red','blue1'],columns = ['up','down','right','left']) 4 s = ['<HTML>'] 5 s.append('<HEAD><TITLE>My DataFrame</TITLE></HEAD>') 6 s.append(' <B0DY>') 7 s.append(frame.to_html()) 8 s.append('</BODY></HTML>') 9 html = ''.join(s) 10 html_file = open('pandas_data_test\myFrame.html','w') 11 html_file.write(html) 12 html_file.close() 13 web_frames = pd.read_html('pandas_data_test\myFrame.html') 14 print(web_frames[0]) 15 ranking = pd.read_html('http://www.meccanismocomplesso.org/en/ eccanismo-complesso-sito-2/classifica-punteggio/') 16 print(ranking[0][1:10]) # 輸出網頁內容的前10行
17 Out[5]: 18 <table border="1" class="dataframe">
19 <thead>
20 <tr style="text-align: right;">
21 <th></th>
22 <th>0</th>
23 <th>1</th>
24 </tr>
25 </thead>
26 <tbody>
27 <tr>
28 <th>0</th>
29 <td>0</td>
30 <td>1</td>
31 </tr>
32 <tr>
33 <th>1</th>
34 <td>2</td>
35 <td>3</td>
36 </tr>
37 </tbody>
38 </table>
39 Unnamed: 0 0 1
40 0 0 0 1
41 1 1 2 3
42 # Nome Exp Livelli
43 1 2 admin 9029 NaN 44 2 3 BrunoOrsini 2124 NaN 45 3 4 Berserker 700 NaN 46 4 5 Dnocioni 543 NaN 47 5 6 albertosallusti 409 NaN 48 6 7 Jon 233 NaN 49 7 8 Mr.Y 180 NaN 50 8 9 michele sisinni 157 NaN 51 9 10 Selina 136 NaN
從XML讀取數據
pandas的所有I/O API函數中,沒有專門用來處理XML(可擴展標記語言)格式的。雖然沒有, 但這種格式其實
很重要,因為很多結構化數據都是以XML格式存儲的。pandas沒有專門的處理函 數也沒關系,因為Python
有很多讀寫XML格式數據的庫(除了pandas)。其中一個庫叫作lxml,它在大文件處理方面性能優異,因而從
眾多同類庫之中脫穎而出。這 一節將介紹如何用它處理XML文件,以及如何把它和pandas整合起來,以最
終從XML文件中獲 取到所需數據並將其轉換為DataFrame對象。
XML源文件如下圖所示
1 from lxml import objectify 2
3 xml = objectify.parse('pandas_data_test\\books.xml') 4 root = xml.getroot() # 獲取根節點
5 print(root.Book.Author) 6 mes1 = root.Book.getchildren() 7 print("root.Book.getchildren()獲取的子標簽內容:\n", mes1) 8 mes2 = root.Book[1].getchildren() # 取第二個Book標簽
9 print([child.tag for child in mes2]) # 獲取子標簽
10 print([child.text for child in mes2]) # 獲取的子標簽內容
11 Out[6]: 12 272103_l_EnRoss, Mark 13 root.Book.getchildren()獲取的子標簽內容: 14 [' 272103_l_EnRoss, Mark', 'XML Cookbook', 'Computer', 23.56, '2014-22-0l'] 15 ['Author', 'Title', 'Genre', 'Price', 'PublishDate'] 16 [' 272l03_l_EnBracket, Barbara', 'XML for Dummies', 'Computer', '35.95', '20l4-l2-l6']
讀寫 Microsoft Excel文件
read_excel()、to_excel(),能夠讀取.xls和.xlsx兩種類型的文件。
讀寫JSON數據
read_json()、to_json()
HDF5格式
至此,已學習了文本格式的讀寫。若要分析大量數據,最好使用二進制格式。Python有多 種二進制數據處理
工具。HDF5庫在這個方面取得了一定的成功。HDF代表等級數據格式(hierarchical data format )。HDF5
庫關注的是HDF5文件的讀寫,這種文件的數據結構由節點組成,能夠存儲大量數據集。該庫全部用c語言
開發,提供了python/matlab和Java語言接口。它的迅速擴展得益於開發人 員的廣泛使用,還得益於它的效
率,尤其是使用這種格式存儲大量數據,其效率很高。比起其他處理起二進制數據更為簡單的格式,HDF5
支持實時壓縮,因而能夠利用數據結構中的重復模式壓縮文件。目前,Python提供兩種操縱HDF5格式數據
的方法:PyTables和h5py。這兩種方法有幾點不同,選用哪一種很大程度上取決於具體需求。
h5py為HDF5的高級API提供接口。PyTables封裝了很多HDF5細節,提供更加靈活的數據容器、索引表、搜索
功能和其他計算相關的介質。pandas還有一個叫作HDFStore、類似於diet的類,它用PyTables存儲pandas
對象。使用HDF5格式之前,必須導人HDFStore類。
1 from pandas.io.pytables import HDFStore 2 # 注意這里需要tables這個包,沒有請自行安裝
3 frame = pd.DataFrame(np.arange(16).reshape(4,4),index=['white','black1','red','blue'],columns=['up','down','right','left']) 4 store = HDFStore('pandas_data_test\mydata.h5') 5 store['obj1'] = frame 6 frame1 = pd.DataFrame(np.random.rand(16).reshape(4,4),index=['white','black1','red','blue'],columns=['up','down','right','left']) 7 store['obj2'] = frame1 8 print(store['obj1']) 9 print(store['obj2']) 10 Out[7]: 11 up down right left 12 white 0 1 2 3
13 black1 4 5 6 7
14 red 8 9 10 11
15 blue 12 13 14 15
16 up down right left 17 white 0.251269 0.422823 0.619294 0.273534
18 black1 0.593960 0.353969 0.966026 0.104581
19 red 0.964577 0.625644 0.342923 0.638627
20 blue 0.246541 0.997952 0.414599 0.908750
21 Closing remaining open files:pandas_data_test\mydata.h5...done
實現對象序列化
pickle模塊實現了一個強大的算法,能夠對用Python實現的數據結構進行序列化(pickling) 和反序列化操作。
序列化是指把對象的層級結構轉換為字節流的過程。序列化便於對象的傳輸、存儲和重建,僅用接收器就能重
建對象,還能保留它的所有原始特征。
用pandas庫實現對象序列化(反序列化)很方便,所有工具都是現成的,無需在Python會話中導入cPickle模
塊,所有的操作都是隱式進行的。 pandas的序列化格式並不是完全使用ASCII編碼。
1 import pickle 2 data = { 'color': ['white','red'], 'value': [5, 7]} 3 pickled_data = pickle.dumps(data) 4 print(pickled_data) 5 nframe = pickle.loads(pickled_data) 6 print(nframe) 7
8 # 用pandas序列化
9 frame = pd.DataFrame(np.arange(16).reshape(4,4), index = ['up','down','left','right']) 10 frame.to_pickle('pandas_data_test\\frame.pkl') # 同json數據類似
11 print(pd.read_pickle('pandas_data_test\\frame.pkl')) # 反序列化,讀取數據
12 Out[8]: 13 b'\x80\x03}q\x00(X\x05\x00\x00\x00colorq\x01]q\x02(X\x05\x00\x00\x00whiteq\x03X\x03\x00\x00\x00redq\x04eX\x05\x00\x00\x00valueq\x05]q\x06(K\x05K\x07eu.' 14 {'color': ['white', 'red'], 'value': [5, 7]} 15 0 1 2 3
16 up 0 1 2 3
17 down 4 5 6 7
18 left 8 9 10 11
19 right 12 13 14 15
對接數據庫
在很多應用中,所使用的數據來自於文本文件的很少,因為文本文件不是存儲數據最有效的方式。
數據往往存儲於SQL類關系型數據庫,作為補充,NoSQL數據庫近來也已流行開來。
從SQL數據庫加載數據,將其轉換為DataFrame對象很簡單pandas提供的幾個函數簡化了該過程。
pandas.io.sql模塊提供獨立於數據庫、叫作sqlalchemy的統一接口。該接口簡化了連接模式, 不管對於
什么類型的數據庫,操作命令都只有一套。連接數據庫使用create_engine()函數,你可以用它配置驅動器所
需的用戶名、密碼、端口和數據庫實例等所有屬性。 數據庫URL的典型形式是:
dialect+driver://username:password@host:port/database
名稱的標識名稱,例如sqlite,mysql,postgresql,oracle,或mssql。drivername是用於使用全小寫字母連接
到數據庫的DBAPI的名稱。如果未指定,則將導入“默認”DBAPI(如果可用) - 此默認值通常是該后端可用的
最廣泛的驅動程序。
1 from sqlalchemy import create_engine 2
3 # PostgreSQL數據庫
4 # default
5 engine = create_engine('postgresql://scott:tiger@localhost/mydatabase') 6 # pg8000 驅動器
7 engine = create_engine('postgresql+pg8000://scott:tiger@localhost/mydatabase') 8 # psycopg2 驅動器
9 engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase') 10 # MySql
11 # default
12 engine = create_engine('mysql://scott:tiger@localhost/foo') 13
14 # mysql-python 注意驅動器后面的對應關系
15 engine = create_engine('mysql+mysqldb://scott:tiger@localhost/foo') 16
17 # MySQL-connector-python
18 engine = create_engine('mysql+mysqlconnector://scott:tiger@localhost/foo') 19 # OurSQL
20 engine = create_engine('mysql+oursql://scott:tiger@localhost/foo') 21 # Oracle
22 engine = create_engine('oracle://scott:tiger@127.0.0.1:1521/sidname') 23
24 engine = create_engine('oracle+cx_oracle://scott:tiger@tnsname') 25 # Microsoft SQL
26 # pyodbc
27 engine = create_engine('mssql+pyodbc://scott:tiger@mydsn') 28
29 # pymssql
30 engine = create_engine('mssql+pymssql://scott:tiger@hostname:port/dbname')
SQLite:
由於SQLite連接到本地文件,因此URL格式略有不同。URL的“文件”部分是數據庫的文件名。
對於相對文件路徑,這需要三個斜杠:engine = create_engine('sqlite:///foo.db')
對於絕對文件路徑,三個斜杠后面是絕對路徑:
Unix/Mac - 4 initial slashes in total
engine = create_engine('sqlite:////absolute/path/to/foo.db')
Windows
engine = create_engine('sqlite:///C:\path\to\foo.db')
Windows alternative using raw string
engine = create_engine(r'sqlite:///C:\path\to\foo.db')
SQLite3數據讀寫
學習使用Python內置的SQLite數據庫sqlite3。SQLite3工具實現了簡單、 輕量級的DBMS SQL,
因此可以內置於用Python語言實現的任何應用。它很實用,你可以在單個文件中創建一個嵌入式數據庫。
若想使用數據庫的所有功能而又不想安裝真正的數據庫,這個工具就是最佳選擇。若想在使用真正
的數據庫之前練習數據庫操作,或在單一程序中使用數據庫存儲數據而無需考慮接口, SQLite3都是不
錯的選擇。
1 from sqlalchemy import create_engine 2 frame = pd.DataFrame( np.arange(20).reshape(4,5),columns=['white','red','blue','black','green']) 3 # 連接SQLite3數據庫
4 engine = create_engine('sqlite:///pandas_data_test/foo.db') 5 # 把DataFrame轉換為數據庫表。
6 # to_sql(self, name, con, schema=None, if_exists='fail', index=True,
7 # index_label=None, chunksize=None, dtype=None)
8 frame.to_sql('colors',engine) 9
10 # 讀取
11 print(pd.read_sql('colors',engine))
運行結果: