Python數據分析庫pandas ------ pandas數據讀寫


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))

 

  運行結果:

  

 


免責聲明!

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



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