python用pandas數(shù)據(jù)加載、存儲(chǔ)與文件格式的實(shí)例
數(shù)據(jù)加載、存儲(chǔ)與文件格式
pandas提供了一些用于將表格型數(shù)據(jù)讀取為DataFrame對(duì)象的函數(shù)。其中read_csv和read_talbe用得最多
pandas中的解析函數(shù):
函數(shù) 說明
read_csv 從文件、URL、文件型對(duì)象中加載帶分隔符的數(shù)據(jù),默認(rèn)分隔符為逗號(hào)
read_table 從文件、URL、文件型對(duì)象中加載帶分隔符的數(shù)據(jù)。默認(rèn)分隔符為制表符("\t")
read_fwf 讀取定寬列格式數(shù)據(jù)(也就是說,沒有分隔符)
read_clipboard 讀取剪貼板中的數(shù)據(jù),可以看做read_table的剪貼板版。在將網(wǎng)頁轉(zhuǎn)換為表格時(shí)很有用
下面介紹一下這些函數(shù)在將文本數(shù)據(jù)轉(zhuǎn)換為DataFrame時(shí)所用到的一些技術(shù)。這些函數(shù)的選項(xiàng)可以劃分為以下幾個(gè)大類:
(1)索引:將一個(gè)或多個(gè)列當(dāng)做返回的DataFrame處理,以及是否從文件、用戶獲取列名
(2)類型推斷和數(shù)據(jù)轉(zhuǎn)換:包括用戶定義值的轉(zhuǎn)換、缺失值標(biāo)記列表等。(類型推斷是這些函數(shù)中最重要的功能之一)
(3)日期解析:包括組合功能,比如將分散在多個(gè)列中的日期時(shí)間信息組合成結(jié)果中的單個(gè)列。
(4)迭代:支持對(duì)大文件進(jìn)行逐塊迭代。
(5)不規(guī)整數(shù)據(jù)問題:跳過一些行、頁腳、注釋或其他一些不重要的東西(比如成千上萬個(gè)逗號(hào)隔開的數(shù)值數(shù)據(jù))
1. 讀寫文本格式的數(shù)據(jù):
(1)由于該文件以逗號(hào)分隔,所以我們可以使用read_csv將其讀入一個(gè)DataFrame:
import pandas as pd import numpy as np
#'ex1.csv'的內(nèi)容如下: # a,b,c,d,message # 1,2,3,4,hello # 5,6,7,8,world # 9,10,11,12,foo df=pd.read_csv('ex1.csv') print df #輸出結(jié)果如下: # a b c d message # 0 1 2 3 4 hello # 1 5 6 7 8 world # 2 9 10 11 12 foo
(2)我們也可以用read_table,只不過需要指定分隔符而己:
df=pd.read_table('ex1.csv',sep=',') print df #輸出結(jié)果如下: # a b c d message # 0 1 2 3 4 hello # 1 5 6 7 8 world # 2 9 10 11 12 foo
(3)讀入文件可以讓pandas為其分配默認(rèn)的列名,也可以自己定義列名:
print pd.read_csv('ex1.csv',header=None) #輸出結(jié)果如下: # 0 1 2 3 4 # 0 a b c d message # 1 1 2 3 4 hello # 2 5 6 7 8 world # 3 9 10 11 12 foo print pd.read_csv('ex1.csv',names=['a','b','c','d','message']) #輸出結(jié)果如下: # a b c d message # 0 a b c d message # 1 1 2 3 4 hello # 2 5 6 7 8 world # 3 9 10 11 12 foo
(4)假如希望將message列做成DataFrame的索引,也可以明確表示要將該列放到索引4的位置上,也可以通過index_col參數(shù)指定"message"
names=['a','b','c','d','message'] print pd.read_csv('ex1.csv',names=names) #輸出結(jié)果如下: # a b c d message # 0 a b c d message # 1 1 2 3 4 hello # 2 5 6 7 8 world # 3 9 10 11 12 foo print pd.read_csv('ex1.csv',names=names,index_col='message') #輸出結(jié)果如下: # a b c d # message # message a b c d # hello 1 2 3 4 # world 5 6 7 8 # foo 9 10 11 12
(5)如果希望將多個(gè)列做成一個(gè)層次化索引,只需傳入由列編號(hào)或列名組成的列表即可:
#'csv_mindex.csv'的內(nèi)容如下: # key1,key2,value1,value2 # one,a,1,2 # one,b,3,4 # one,c,5,6 # one,d,7,8 # two,a,9,10 # two,b,11,12 # two,c,13,14 # two,d,15,16 parsed=pd.read_csv('csv_mindex.csv',index_col=['key1','key2']) #index_col表示為行索引 print parsed # value1 value2 # key1 key2 # one a 1 2 # b 3 4 # c 5 6 # d 7 8 # two a 9 10 # b 11 12 # c 13 14 # d 15 16
(6)有些表示可能不是用固定的分隔符去分隔字段的(比如空白符或其它字符串)。對(duì)于這些情況,可以編寫一個(gè)正則表達(dá)式來作為read_table
# 的分隔符??聪旅娴奈谋疚募? #'ex3.txt'的內(nèi)容如下 # A B C, # aaa -0.264438 -1.026059 -0.619500 # bbb 0.9283898 0.3928928 -0.032388 # ccc -0.264327 -0.386313 -0.217601 # ddd -0.878218 -0.348238 1.1004919 print list(open('ex3.txt')) #輸出結(jié)果如下: # [' A B C,\n', # 'aaa -0.264438 -1.026059 -0.619500\n', # 'bbb 0.9283898 0.3928928 -0.032388\n', # 'ccc -0.264327 -0.386313 -0.217601\n', # 'ddd -0.878218 -0.348238 1.1004919'] #該文件各個(gè)字段由數(shù)量不定的空白符分隔,則可以用正則表達(dá)式\s+表示: #正則表達(dá)式:\s表示空白符,\S非空白符,+表示后面會(huì)一直匹配下去。即\s+會(huì)匹配多個(gè)空格符 result=pd.read_table('ex3.txt',sep='\s+') print result #輸出結(jié)果如下: # A B C, # aaa -0.264438 -1.026059 -0.619500 # bbb 0.928390 0.392893 -0.032388 # ccc -0.264327 -0.386313 -0.217601 # ddd -0.878218 -0.348238 1.100492 #注意:這里由于列名比數(shù)據(jù)行的數(shù)量少(即A,B,C三個(gè)列名,但是列的數(shù)據(jù)是4列),所以read_table推斷第一列應(yīng)該是DataFrame的索引。
(7)skiprows跳過文件的一些行,可以幫助處理各種各樣的異形文件格式
#'ex4.csv'的內(nèi)容如下: ##hey! # a,b,c,d,message # #just wanted to make thins more difficult for u # # who reads CSV files with computers,anyway? # 1,2,3,4,hello # 5,6,7,8,world # 9,10,11,12,foo print pd.read_csv('ex4.txt',skiprows=[0,2,3]) #輸出結(jié)果如下: # a b c d message # 0 1 2 3 4 hello # 1 5 6 7 8 world # 2 9 10 11 12 foo
(8)缺失值處理是文件解析任務(wù)中的一個(gè)重要組成部分。缺失數(shù)據(jù)經(jīng)常是要么沒有(空字符串),要么用某個(gè)標(biāo)記值表示。
#默認(rèn)情況下,pandas會(huì)用一組經(jīng)常出現(xiàn)的標(biāo)記值進(jìn)行識(shí)別,如NA,-1.#IND以及NULL等。 #'ex5.csv'的內(nèi)容如下: # something,a,b,c,d,message # one,1,2,3,4,NA # two,5,6,,8,world # three,9,10,11,12,foo result=pd.read_csv('ex5.csv') print result #輸出結(jié)果如下: # something a b c d message # 0 one 1 2 3.0 4 NaN # 1 two 5 6 NaN 8 world # 2 three 9 10 11.0 12 foo print pd.isnull(result) #查看為缺失值 #輸出結(jié)果如下: # something a b c d message # 0 False False False False False True # 1 False False False True False False # 2 False False False False False False
(9) na_values可以接受一組用于表示缺失值的字符串:
result=pd.read_csv('ex5.csv',na_values=['NULL']) print result #輸出結(jié)果如下: # something a b c d message # 0 one 1 2 3.0 4 NaN # 1 two 5 6 NaN 8 world # 2 three 9 10 11.0 12 foo
(10) 可以用一個(gè)字典為各列指定不同的NA標(biāo)記值
sentinels={'message':['foo','NA'],'something':['two']} #將message列中的foo標(biāo)成NA,something的two也標(biāo)成NA print pd.read_csv('ex5.csv',na_values=sentinels) #輸出結(jié)果如下: # something a b c d message # 0 one 1 2 3.0 4 NaN # 1 NaN 5 6 NaN 8 world # 2 three 9 10 11.0 12 NaN read_csv/read_table函數(shù)的參數(shù):
參數(shù) 說明 path 表示文件系統(tǒng)位置、url、文件型對(duì)象的字符串 sep或delimiter 用于對(duì)行各字段進(jìn)行拆分的字符序列或正則表達(dá)式 header 用作列名的行號(hào)。默認(rèn)為0(第一行),如果沒有header行就應(yīng)該設(shè)置為None index_col 用作行索引的列編號(hào)或列名??梢允菃蝹€(gè)名稱/數(shù)字或多個(gè)名稱/數(shù)字組成的列表(層次化索引) names 用于結(jié)果的列名列表,結(jié)合header=None skiprows 需要忽略的行數(shù)(從文件開始處算起),或需要跳過的行號(hào)列表(從0開始) na_values 一組用于替換NA的值 comment 用于將注釋信息從行尾拆分出去的字符(一個(gè)或多個(gè)) parse_dates 嘗試將數(shù)據(jù)解析為日期,默認(rèn)為False.如果為True,則嘗試解析所有列。此外,還可以指定需要解析的一組 列號(hào)或列名。如果列表的元素為列表或元組,就會(huì)將多個(gè)列組合到一起再進(jìn)行日期解析工作(例如,日期/時(shí)間 分別位于兩個(gè)列中) keep_date_col 如果連接多列解析日期,則保持參與連接的列。默認(rèn)為False. converters 由列號(hào)/列名跟函數(shù)之間的映射關(guān)系組成的字典。例如,{‘foo':f}會(huì)對(duì)foo列的所有值應(yīng)用函數(shù)f dayfirst 當(dāng)解析有歧義的日期時(shí),將其看做國際格式(例如:7/6/2012->June,7,2012).默認(rèn)為False date_parser 用于解析日期的函數(shù) nrows 需要讀取的行數(shù)(從文件開始處算起) iterator 返回一個(gè)TextParser以便逐塊讀取文件 chunksize 文件塊的大小(用于迭代) skip_footer 需要忽略的行數(shù)(從文件末尾處算起) verbose 打印各種解析器輸出信息,比如“非數(shù)值列中缺失值的數(shù)量”等 encoding 用于unicode的文本編碼格式。 squeeze 如果數(shù)據(jù)經(jīng)解析后僅含一列,則返回Series thousands 千分位分隔符,如“,”或“?!?
逐塊讀取文本文件:
在處理很大文件時(shí),或找出大文件中的參數(shù)集以便于后續(xù)處理時(shí),你可能只想讀取文件的一小部分或逐塊對(duì)文件進(jìn)行迭代。
import pandas as pd import numpy as np from pandas import Series,DataFrame #'ex6.csv'的內(nèi)容如下: # <class 'pandas.core.frame.DataFrame'> # Int64Index:10000 entries, 0 to 9999 # Data columns: # one 10000 non-null values # two 10000 non-null values # three 10000 non-null values # four 10000 non-null values # key 10000 non-null values # dtypes: float64(4),object(1) print pd.read_csv('ex6.csv',nrows=5) #nrows=5取前6行,下標(biāo)從0開始 #要逐塊讀取文件,需要設(shè)置chunksize(行數(shù)) chunker=pd.read_csv('ex6.csv',chunksize=1000) print chunker #輸出結(jié)果如下: # <pandas.io.parsers.TextFileReader object at 0x102ebb5d0> #read_csv所返回的這個(gè)TextParser對(duì)象使你可以根據(jù)chunksize對(duì)文件進(jìn)行逐塊迭代。比如說: #我們可以迭代處理ex6.csv,將值計(jì)數(shù)聚合到"key"列中。 tot=Series([]) for piece in chunker: tot=tot.add(piece['key'].value_counts(),fill_value=0) #value_counts計(jì)算個(gè)數(shù),fill_value為空時(shí)填充0 tot=tot.order(ascending=False) #此版本Series沒有有order,可以換成sort_value # tot=tot.sort_value(ascending=False) print tot #報(bào)key錯(cuò)誤
將數(shù)據(jù)寫到文本格式:
數(shù)據(jù)也可以被輸出為分隔符格式文本
data=pd.read_csv('ex5.csv') #輸出結(jié)果如下: print data #輸出結(jié)果如下: # something a b c d message # 0 one 1 2 3.0 4 NaN # 1 two 5 6 NaN 8 world # 2 three 9 10 11.0 12 foo
DataFrame的to_csv方法:
(1)數(shù)據(jù)寫入:to_csv,利用DataFrame的to_csv方法,我們可以將數(shù)據(jù)寫到一個(gè)以逗號(hào)分隔的文件中
print data.to_csv('out.csv') #out.csv的內(nèi)容如下: # ,something,a,b,c,d,message # 0,one,1,2,3.0,4, # 1,two,5,6,,8,world # 2,three,9,10,11.0,12,foo
(2)當(dāng)然也可以使用其他分隔符(由于這里直接寫到sys.stdout控制臺(tái),所以僅僅是打印出文本結(jié)果而己)
print data.to_csv(sys.stdout,sep='|') #輸出結(jié)果如下: # None # |something|a|b|c|d|message # 0|one|1|2|3.0|4| # 1|two|5|6||8|world # 2|three|9|10|11.0|12|foo # None
(3)缺失值在輸出結(jié)果中會(huì)被表示為空字符串,若希望將其表示為別的標(biāo)記值用na_sep='NULL'
print data.to_csv(sys.stdout,na_rep='NULL') #輸出結(jié)果如下: # ,something,a,b,c,d,message # 0,one,1,2,3.0,4,NULL # 1,two,5,6,NULL,8,world # 2,three,9,10,11.0,12,foo # None
(4)如果沒有設(shè)置其它選項(xiàng),則會(huì)寫出行和列的標(biāo)簽。當(dāng)然,它們也都可以被禁用:index=False,header=False
print data.to_csv(sys.stdout,index=False,header=False) #行標(biāo)簽index,列標(biāo)簽header #輸出結(jié)果如下: # one,1,2,3.0,4, # two,5,6,,8,world # three,9,10,11.0,12,foo # None
(5)還可以只寫出一部分的列,并以你指定的順序排序:index=False,columns=[]
print data.to_csv(sys.stdout,index=False,columns=['a','b','c']) #輸出結(jié)果如下: # a,b,c # 1,2,3.0 # 5,6, # 9,10,11.0 # None
Series的to_csv方法:
(1)Series的to_csv方法,將Series寫入到.csv文件中
dates=pd.date_range('1/1/2000',periods=7) #date_range可以生成時(shí)間序列,periods=7表示可以生成7個(gè)時(shí)間序列,從2000/1/1開始 print dates #輸出結(jié)果如下: # DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04', # '2000-01-05', '2000-01-06', '2000-01-07'], # dtype='datetime64[ns]', freq='D') ts=Series(np.arange(7),index=dates) #index行索引用dates ts.to_csv('tseries.csv') #tseries.csv的內(nèi)容如下: # 2000-01-01,0 # 2000-01-02,1 # 2000-01-03,2 # 2000-01-04,3 # 2000-01-05,4 # 2000-01-06,5 # 2000-01-07,6
(2)read_csv也可以將csv文件讀取為Series(Series.read_csv,而DataFrame則用pd.read_csv),但還有一個(gè)更為方更的from_csv方法
print Series.from_csv('tseries.csv',parse_dates=True) #輸出結(jié)果如下: # 2000-01-01 0 # 2000-01-02 1 # 2000-01-03 2 # 2000-01-04 3 # 2000-01-05 4 # 2000-01-06 5 # 2000-01-07 6 # dtype: int64
from_csv和read_csv中參數(shù)整理如下:
pandas.read_csv參數(shù)整理 讀取CSV(逗號(hào)分割)文件到DataFrame 也支持文件的部分導(dǎo)入和選擇迭代 更多幫助參見:http://pandas.pydata.org/pandas-docs/stable/io.html 參數(shù): filepath_or_buffer : str,pathlib。str, pathlib.Path, py._path.local.LocalPath or any object with a read() method (such as a file handle or StringIO) 可以是URL,可用URL類型包括:http, ftp, s3和文件。對(duì)于多文件正在準(zhǔn)備中 本地文件讀取實(shí)例:://localhost/path/to/table.csv sep : str, default ‘,' 指定分隔符。如果不指定參數(shù),則會(huì)嘗試使用逗號(hào)分隔。分隔符長(zhǎng)于一個(gè)字符并且不是‘\s+',將使用python的語法分析器。并且忽略數(shù)據(jù)中的逗號(hào)。正則表達(dá)式例子:'\r\t' delimiter : str, default None 定界符,備選分隔符(如果指定該參數(shù),則sep參數(shù)失效) delim_whitespace : boolean, default False. 指定空格(例如' ‘或者' ‘)是否作為分隔符使用,等效于設(shè)定sep='\s+'。如果這個(gè)參數(shù)設(shè)定為Ture那么delimiter 參數(shù)失效。 在新版本0.18.1支持 header : int or list of ints, default ‘infer' 指定行數(shù)用來作為列名,數(shù)據(jù)開始行數(shù)。如果文件中沒有列名,則默認(rèn)為0,否則設(shè)置為None。如果明確設(shè)定header=0 就會(huì)替換掉原來存在列名。header參數(shù)可以是一個(gè)list例如:[0,1,3],這個(gè)list表示將文件中的這些行作為列標(biāo)題(意味著每一列有多個(gè)標(biāo)題),介于中間的行將被忽略掉(例如本例中的2;本例中的數(shù)據(jù)1,2,4行將被作為多級(jí)標(biāo)題出現(xiàn),第3行數(shù)據(jù)將被丟棄,dataframe的數(shù)據(jù)從第5行開始。)。 注意:如果skip_blank_lines=True 那么header參數(shù)忽略注釋行和空行,所以header=0表示第一行數(shù)據(jù)而不是文件的第一行。 names : array-like, default None 用于結(jié)果的列名列表,如果數(shù)據(jù)文件中沒有列標(biāo)題行,就需要執(zhí)行header=None。默認(rèn)列表中不能出現(xiàn)重復(fù),除非設(shè)定參數(shù)mangle_dupe_cols=True。 index_col : int or sequence or False, default None 用作行索引的列編號(hào)或者列名,如果給定一個(gè)序列則有多個(gè)行索引。 如果文件不規(guī)則,行尾有分隔符,則可以設(shè)定index_col=False 來是的pandas不適用第一列作為行索引。 usecols : array-like, default None 返回一個(gè)數(shù)據(jù)子集,該列表中的值必須可以對(duì)應(yīng)到文件中的位置(數(shù)字可以對(duì)應(yīng)到指定的列)或者是字符傳為文件中的列名。例如:usecols有效參數(shù)可能是 [0,1,2]或者是 [‘foo', ‘bar', ‘baz']。使用這個(gè)參數(shù)可以加快加載速度并降低內(nèi)存消耗。 as_recarray : boolean, default False 不贊成使用:該參數(shù)會(huì)在未來版本移除。請(qǐng)使用pd.read_csv(...).to_records()替代。 返回一個(gè)Numpy的recarray來替代DataFrame。如果該參數(shù)設(shè)定為True。將會(huì)優(yōu)先squeeze參數(shù)使用。并且行索引將不再可用,索引列也將被忽略。 squeeze : boolean, default False 如果文件值包含一列,則返回一個(gè)Series prefix : str, default None 在沒有列標(biāo)題時(shí),給列添加前綴。例如:添加‘X' 成為 X0, X1, ... mangle_dupe_cols : boolean, default True 重復(fù)的列,將‘X'...'X'表示為‘X.0'...'X.N'。如果設(shè)定為false則會(huì)將所有重名列覆蓋。 dtype : Type name or dict of column -> type, default None 每列數(shù)據(jù)的數(shù)據(jù)類型。例如 {‘a(chǎn)': np.float64, ‘b': np.int32} engine : {‘c', ‘python'}, optional Parser engine to use. The C engine is faster while the python engine is currently more feature-complete. 使用的分析引擎??梢赃x擇C或者是python。C引擎快但是Python引擎功能更加完備。 converters : dict, default None 列轉(zhuǎn)換函數(shù)的字典。key可以是列名或者列的序號(hào)。 true_values : list, default None Values to consider as True false_values : list, default None Values to consider as False skipinitialspace : boolean, default False 忽略分隔符后的空白(默認(rèn)為False,即不忽略). skiprows : list-like or integer, default None 需要忽略的行數(shù)(從文件開始處算起),或需要跳過的行號(hào)列表(從0開始)。 skipfooter : int, default 0 從文件尾部開始忽略。 (c引擎不支持) skip_footer : int, default 0 不推薦使用:建議使用skipfooter ,功能一樣。 nrows : int, default None 需要讀取的行數(shù)(從文件頭開始算起)。 na_values : scalar, str, list-like, or dict, default None 一組用于替換NA/NaN的值。如果傳參,需要制定特定列的空值。默認(rèn)為‘1.#IND', ‘1.#QNAN', ‘N/A', ‘NA', ‘NULL', ‘NaN', ‘nan'`. keep_default_na : bool, default True 如果指定na_values參數(shù),并且keep_default_na=False,那么默認(rèn)的NaN將被覆蓋,否則添加。 na_filter : boolean, default True 是否檢查丟失值(空字符串或者是空值)。對(duì)于大文件來說數(shù)據(jù)集中沒有空值,設(shè)定na_filter=False可以提升讀取速度。 verbose : boolean, default False 是否打印各種解析器的輸出信息,例如:“非數(shù)值列中缺失值的數(shù)量”等。 skip_blank_lines : boolean, default True 如果為True,則跳過空行;否則記為NaN。 parse_dates : boolean or list of ints or names or list of lists or dict, default False boolean. True -> 解析索引 list of ints or names. e.g. If [1, 2, 3] -> 解析1,2,3列的值作為獨(dú)立的日期列; list of lists. e.g. If [[1, 3]] -> 合并1,3列作為一個(gè)日期列使用 dict, e.g. {‘foo' : [1, 3]} -> 將1,3列合并,并給合并后的列起名為"foo" infer_datetime_format : boolean, default False 如果設(shè)定為True并且parse_dates 可用,那么pandas將嘗試轉(zhuǎn)換為日期類型,如果可以轉(zhuǎn)換,轉(zhuǎn)換方法并解析。在某些情況下會(huì)快5~10倍。 keep_date_col : boolean, default False 如果連接多列解析日期,則保持參與連接的列。默認(rèn)為False。 date_parser : function, default None 用于解析日期的函數(shù),默認(rèn)使用dateutil.parser.parser來做轉(zhuǎn)換。Pandas嘗試使用三種不同的方式解析,如果遇到問題則使用下一種方式。 1.使用一個(gè)或者多個(gè)arrays(由parse_dates指定)作為參數(shù); 2.連接指定多列字符串作為一個(gè)列作為參數(shù); 3.每行調(diào)用一次date_parser函數(shù)來解析一個(gè)或者多個(gè)字符串(由parse_dates指定)作為參數(shù)。 dayfirst : boolean, default False DD/MM格式的日期類型 iterator : boolean, default False 返回一個(gè)TextFileReader 對(duì)象,以便逐塊處理文件。 chunksize : int, default None 文件塊的大小, See IO Tools docs for more informationon iterator and chunksize. compression : {‘infer', ‘gzip', ‘bz2', ‘zip', ‘xz', None}, default ‘infer' 直接使用磁盤上的壓縮文件。如果使用infer參數(shù),則使用 gzip, bz2, zip或者解壓文件名中以‘.gz', ‘.bz2', ‘.zip', or ‘xz'這些為后綴的文件,否則不解壓。如果使用zip,那么ZIP包中國必須只包含一個(gè)文件。設(shè)置為None則不解壓。 新版本0.18.1版本支持zip和xz解壓 thousands : str, default None 千分位分割符,如“,”或者“." decimal : str, default ‘.' 字符中的小數(shù)點(diǎn) (例如:歐洲數(shù)據(jù)使用',‘). float_precision : string, default None Specifies which converter the C engine should use for floating-point values. The options are None for the ordinary converter, high for the high-precision converter, and round_trip for the round-trip converter. 指定 lineterminator : str (length 1), default None 行分割符,只在C解析器下使用。 quotechar : str (length 1), optional 引號(hào),用作標(biāo)識(shí)開始和解釋的字符,引號(hào)內(nèi)的分割符將被忽略。 quoting : int or csv.QUOTE_* instance, default 0 控制csv中的引號(hào)常量??蛇x QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3) doublequote : boolean, default True 雙引號(hào),當(dāng)單引號(hào)已經(jīng)被定義,并且quoting 參數(shù)不是QUOTE_NONE的時(shí)候,使用雙引號(hào)表示引號(hào)內(nèi)的元素作為一個(gè)元素使用。 escapechar : str (length 1), default None 當(dāng)quoting 為QUOTE_NONE時(shí),指定一個(gè)字符使的不受分隔符限值。 comment : str, default None 標(biāo)識(shí)著多余的行不被解析。如果該字符出現(xiàn)在行首,這一行將被全部忽略。這個(gè)參數(shù)只能是一個(gè)字符,空行(就像skip_blank_lines=True)注釋行被header和skiprows忽略一樣。例如如果指定comment='#' 解析‘#empty\na,b,c\n1,2,3' 以header=0 那么返回結(jié)果將是以'a,b,c'作為header。 encoding : str, default None 指定字符集類型,通常指定為'utf-8'. List of Python standard encodings dialect : str or csv.Dialect instance, default None 如果沒有指定特定的語言,如果sep大于一個(gè)字符則忽略。具體查看csv.Dialect 文檔 tupleize_cols : boolean, default False Leave a list of tuples on columns as is (default is to convert to a Multi Index on the columns) error_bad_lines : boolean, default True 如果一行包含太多的列,那么默認(rèn)不會(huì)返回DataFrame ,如果設(shè)置成false,那么會(huì)將改行剔除(只能在C解析器下使用)。 warn_bad_lines : boolean, default True 如果error_bad_lines =False,并且warn_bad_lines =True 那么所有的“bad lines”將會(huì)被輸出(只能在C解析器下使用)。 low_memory : boolean, default True 分塊加載到內(nèi)存,再低內(nèi)存消耗中解析。但是可能出現(xiàn)類型混淆。確保類型不被混淆需要設(shè)置為False?;蛘呤褂胐type 參數(shù)指定類型。注意使用chunksize 或者iterator 參數(shù)分塊讀入會(huì)將整個(gè)文件讀入到一個(gè)Dataframe,而忽略類型(只能在C解析器中有效) buffer_lines : int, default None 不推薦使用,這個(gè)參數(shù)將會(huì)在未來版本移除,因?yàn)樗闹翟诮馕銎髦胁煌扑]使用 compact_ints : boolean, default False 不推薦使用,這個(gè)參數(shù)將會(huì)在未來版本移除 如果設(shè)置compact_ints=True ,那么任何有整數(shù)類型構(gòu)成的列將被按照最小的整數(shù)類型存儲(chǔ),是否有符號(hào)將取決于use_unsigned 參數(shù) use_unsigned : boolean, default False 不推薦使用:這個(gè)參數(shù)將會(huì)在未來版本移除 如果整數(shù)列被壓縮(i.e. compact_ints=True),指定被壓縮的列是有符號(hào)還是無符號(hào)的。 memory_map : boolean, default False 如果使用的文件在內(nèi)存內(nèi),那么直接map文件使用。使用這種方式可以避免文件再次進(jìn)行IO操作。
手工處理分隔符格式:csv python內(nèi)置函數(shù)使用
大部分存儲(chǔ)在磁盤上的表格型數(shù)據(jù)都能用pandas.read_table進(jìn)行加載。然而有進(jìn)還是需要手工處理。
由于接收到含有畸形行的文件而使read_table出毛病的情況并不少見。
對(duì)于任何單字符分隔符文件,可以直接使用python內(nèi)置的csv模塊。將任意己打開的文件或文件型的對(duì)象傳給csv.reader
import csv f=open('ex7.csv') reader=csv.reader(f) print reader #輸出結(jié)果是一個(gè)對(duì)象:<_csv.reader object at 0x10d7c7600> for line in reader: print line #對(duì)這個(gè)reader進(jìn)行迭代將會(huì)為每行產(chǎn)生一個(gè)元組 #輸出結(jié)果如下: # ['a', 'b', 'c'] # ['1', '2', '3'] # ['1', '2', '3', '4']
為了使數(shù)據(jù)格式合乎要求,你需要對(duì)其做些調(diào)整
lines=list(csv.reader(open('ex7.csv'))) print lines #輸出結(jié)果如下: # [['a', 'b', 'c'], ['1', '2', '3'], ['1', '2', '3', '4']] print lines[0],lines[1] header,values=lines[0],lines[1:] print zip(*values) #zip(iterable),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組。a=[1,2,3] b=[2,4,5] zip(a,b)=[(1,2),(2,4),(3,5)] #輸出結(jié)果如下: # [('1', '1'), ('2', '2'), ('3', '3')] data_dict={h:v for h, v in zip(header,zip(*values))} print data_dict #輸出結(jié)果如下:結(jié)果得到的是列表,不是元組 # {'a': ('1', '1'), 'c': ('3', '3'), 'b': ('2', '2')}
CSV文件的形式有很多。只需定義csv.Dialect的一個(gè)子類即可定義出新格式(如專門的分隔符、字符串引用約定、行結(jié)束符等)
class my_dialect(csv.Dialect): lineterminator = '\n' delimiter = ';' quotechar = '"' quoting = 0 reader=csv.reader(f,dialect=my_dialect) print reader #輸出結(jié)果如下: # <_csv.reader object at 0x10628a6e0> with open('mydata.csv','w')as f: writer=csv.writer(f,dialect=my_dialect) writer.writerow(('one','two','three')) writer.writerow(('1','2','3')) writer.writerow(('1', '2', '3')) #打開mydata.csv內(nèi)容如下: # one;two;three # 1;2;3 # 1;2;3
各個(gè)csv語句的參數(shù)也可以用關(guān)鍵字的形式提供給csv.reader,無需定義子類:
reader=csv.reader(f,delimiter='|')
csv.writer用于手工輸出分隔符文件,它接受一個(gè)己打開且可寫的文件對(duì)象以及跟csv.reader相同的那些語句和選項(xiàng):
#csv.writer先創(chuàng)建一個(gè)write對(duì)象,然后用writerow寫入,可以一行行寫入,也可以字典寫入 headers = ['Symbol', 'Price', 'Date', 'Time', 'Change', 'Volume'] rows = [{'Symbol':'AA', 'Price':39.48, 'Date':'6/11/2007', 'Time':'9:36am', 'Change':-0.18, 'Volume':181800}, {'Symbol':'AIG', 'Price': 71.38, 'Date':'6/11/2007', 'Time':'9:36am', 'Change':-0.15, 'Volume': 195500}, {'Symbol':'AXP', 'Price': 62.58, 'Date':'6/11/2007', 'Time':'9:36am', 'Change':-0.46, 'Volume': 935000}, ] with open('stock.csv','w') as f: writer=csv.DictWriter(f,headers) writer.writeheader() writer.writerows(rows) #stock.csv的結(jié)果如下: # Symbol,Price,Date,Time,Change,Volume # AA,39.48,6/11/2007,9:36am,-0.18,181800 # AIG,71.38,6/11/2007,9:36am,-0.15,195500 # AXP,62.58,6/11/2007,9:36am,-0.46,935000
csv產(chǎn)生的數(shù)據(jù)都是字符串類型的,它不會(huì)做任何其它類型的轉(zhuǎn)換,如果你需要做這樣的類型轉(zhuǎn)換,必須自己手動(dòng)去實(shí)現(xiàn):
#下面是一個(gè)在csv數(shù)據(jù)上執(zhí)行其他類型轉(zhuǎn)換的例子: col_types=[str,float,str,str,float,int] with open('stock.csv') as f: f_csv=csv.reader(f) headers=next(f_csv) print headers #輸出結(jié)果如下 # ['Symbol', 'Price', 'Date', 'Time', 'Change', 'Volume'] for row in f_csv: rows=tuple(convert(value) for convert,value in zip(col_types,row)) print rows #輸出結(jié)果如下: # ('AA', 39.48, '6/11/2007', '9:36am', -0.18, 181800) # ('AIG', 71.38, '6/11/2007', '9:36am', -0.15, 195500) # ('AXP', 62.58, '6/11/2007', '9:36am', -0.46, 935000) #下面是一個(gè)轉(zhuǎn)換字典中特定字段的例子: field_types = [ ('Price', float), ('Change', float), ('Volume', int) ] with open('stock.csv') as f: for row in csv.DictReader(f): #row指的是每一行 print row row.update((key,coversion(row[key])) for key,coversion in field_types) #key:price conversion:float,row.update(key)如果key在row中找到,則conversion(row[key])的值, # row[key]是指這個(gè)key的value值 print row #輸出如下:第一行是第一個(gè)print row輸出,下面一個(gè)才是轉(zhuǎn)換后的print row的輸出 # {'Symbol': 'AA', 'Volume': '181800', 'Time': '9:36am', 'Date': '6/11/2007', 'Price': '39.48', 'Change': '-0.18'} # {'Symbol': 'AA', 'Volume': 181800, 'Time': '9:36am', 'Date': '6/11/2007', 'Price': 39.48, 'Change': -0.18}
csv 參數(shù)選項(xiàng)如下:
參數(shù) 說明 delimiter 用于分隔字段的單字符字符串。默認(rèn)為“,” lineterminator 用于寫操作的行結(jié)束符,默認(rèn)為“\r\n” quotechar 用于帶有特殊字符(如分隔符)的字段的引用符號(hào)。默認(rèn)為“"” quoting 引用約定??蛇x值包括csv.quote_all(引用所有字段), csv.quote_minimal(只引用帶有諸如分隔符之類特殊字符的字段)默認(rèn)為quote_minimal skipinitialspace 忽略分隔符后面的空白符。默認(rèn)False doublequote 如何處理字段內(nèi)的引用符號(hào)。如果為True,則雙寫。 escapechar 用于對(duì)分隔符進(jìn)行轉(zhuǎn)義的字符串。默認(rèn)禁用
總結(jié):
(1)對(duì)于那些使用復(fù)雜分隔符或多字符分隔符的文件,csv模塊就無能為力了。在這種情況下,就只能用字符串split方法或正則表達(dá)式方法re.split進(jìn)行拆分和其它整理工作了。
(2)最后,如果你讀取CSV數(shù)據(jù)的目的是做數(shù)據(jù)分析和統(tǒng)計(jì)的話,你可能需要看一看 Pandas 包。Pandas 包含了一個(gè)非常方便的函數(shù)叫 pandas.read_csv() ,它可以加載CSV數(shù)據(jù)到一個(gè) DataFrame 對(duì)象中去。 然后利用這個(gè)對(duì)象你就可以生成各種形式的統(tǒng)計(jì)、過濾數(shù)據(jù)以及執(zhí)行其他高級(jí)操作了
json格式的讀取與寫入:
通過json.loads可將json字符串轉(zhuǎn)換成python形式,即從磁盤中讀取
import pandas as pd import numpy as np from pandas import Series,DataFrame import sys import json
obj=""" {"name":"Wes", "places_lived":["United States","Spain","Germany"], "pet":null, "siblings":[{"name":"Scott","age":25,"pet":"Zuko"}, {"name":"Katie","age":33,"pet":"Cisco"}] } """ result=json.loads(obj) print result #輸出結(jié)果如下: {u'pet': None, u'siblings': [{u'pet': u'Zuko', u'age': 25, u'name': u'Scott'}, {u'pet': u'Cisco', u'age': 33, u'name': u'Katie'}], u'name': u'Wes', u'places_lived': [u'United States', u'Spain', u'Germany']}
相反json.dumps則將python對(duì)象轉(zhuǎn)換成JSON格式。即寫入
asjson=json.dumps(result) print asjson #輸出結(jié)果與上面的result一樣的json格式
將(一個(gè)或一組)json對(duì)象轉(zhuǎn)換為DataFrame或其它便于分析的數(shù)據(jù)結(jié)構(gòu)就由你決定了。
最簡(jiǎn)單方便的方式是:向DataFrame構(gòu)造器傳入一組Json對(duì)象,并選取數(shù)據(jù)字段的子集(即可以選一部分字段,也可以全部選定)
siblings=DataFrame(result['siblings'],columns=['name','age']) #選取result中的'siblings',列選取name,age兩列 print siblings #輸出的結(jié)果如下: # name age # 0 Scott 25 # 1 Katie 33
XML和HTML:Web信息收集
python有許多可以讀寫HTML和xml格式數(shù)據(jù)的庫。lxml就是其中之一,它可以高效地解析大件。
lxml有多個(gè)編程接口。首先我們要用lxml.html處理HTML,然后再用lxml.objectify做一些XML處理。
HTML文件處理:
許多網(wǎng)站都將數(shù)據(jù)放到HTML表格中以便在瀏覽器中查看,但不能以一種更易于機(jī)器閱讀的格式(如Json、HTML或XML)進(jìn)行下載
(1)首先,找到你希望獲取數(shù)據(jù)的URL,利用urllib2將其打開,然后用lxml解析得到的數(shù)據(jù)流。
import pandas as pd import numpy as np from pandas import Series,DataFrame import sys import json from urllib2 import urlopen from lxml.html import parse from lxml import objectify
parsed=parse(urlopen('http://finance.yahoo.com/q/op?s=AAPL+Options')) doc=parsed.getroot() #通過這個(gè)對(duì)象可以獲取特定類型的所有HTML標(biāo)簽(tag) #獲取HTML中的鏈接是a標(biāo)簽的,可使用findall方法 links=doc.findall('.//a') #得到所有a標(biāo)簽的對(duì)象,以列表形式顯示 print links[15:20] #輸出結(jié)果如下:輸出的是Html元素對(duì)象 # [<Element a at 0x1085206d8>, # <Element a at 0x108520730>, # <Element a at 0x108520788>, # <Element a at 0x1085207e0>, # <Element a at 0x108520838>]
(2)要得到URL和鏈接文本,必須使用各對(duì)象的get方法(針對(duì)URL)和text_content方法(針對(duì)顯示文本)
lnk=links[15] print lnk #顯示的是下標(biāo)為28的a標(biāo)簽的元素對(duì)象 print lnk.get('href') #用get方法得到以"href"的URL #輸出結(jié)果如下:/quote/AAPL180601P00145000?p=AAPL180601P00145000 print lnk.text_content() #輸出結(jié)果如下:AAPL180601P00145000 #使用下面這條列表推導(dǎo)式可獲取文檔中的全部URL urls=[lnk.get('href') for lnk in doc.findall('.//a')] print urls #輸出結(jié)果如下: # ['https://finance.yahoo.com/', '#Navigation', '#market-summary', '#Main', '#Aside', # 'https://mail.yahoo.com/?.intl=us&.lang=en-US&.partner=none&.src=finance', '/quote/AAPL?p=AAPL', # '/quote/AAPL/key-statistics?p=AAPL', '/quote/AAPL/profile?p=AAPL', '/quote/AAPL/financials?p=AAPL',]
(3)表格:從文檔中找出正確表格,有些網(wǎng)站會(huì)給目標(biāo)表格加上一個(gè)id屬性。下面是兩個(gè)分別放置看漲數(shù)據(jù)和跌數(shù)據(jù)的表格。
每個(gè)表格都有標(biāo)題行。tr是表格中的行,th表頭單元格,td數(shù)據(jù)單元格
tables=doc.findall('.//table') print tables #輸出結(jié)果如下:是表格對(duì)象 # [<Element table at 0x10f1a09f0>, <Element table at 0x10f1a0a48>] calls=tables[0] print calls #輸出的是對(duì)象 #每個(gè)表格都有標(biāo)題行。tr是表格中的行,th表頭單元格,td數(shù)據(jù)單元格 #先取出標(biāo)題行 rows=calls.findall('.//tr') print rows #輸出結(jié)果:也是行的元素對(duì)象如<Element tr at 0x108bffaa0>
#寫一個(gè)函數(shù):可以根據(jù)傳入的參數(shù)得到相關(guān)表格中的數(shù)據(jù) def _unpack(row,kind='td'): elts=row.findall('.//%s' % kind) return [val.text_content() for val in elts] print _unpack(rows[1]) #取數(shù)據(jù)單元格中的數(shù)據(jù)值 #輸出結(jié)果如下:取rows[1]即第2行的數(shù)據(jù) # ['AAPL180608C00130000', '2018-05-04 11:45PM EDT', '130.00', '36.90', '53.40', '54.70', '0.00', '-', '1', '1', '0.00%'] print _unpack(rows[1],kind='th') #取表頭單元格的值,即列的標(biāo)題 #輸出結(jié)果:['Strike','Symbol','Last','Chg','Bid','Ask']
(4)把所有步驟結(jié)合起來,將數(shù)據(jù)轉(zhuǎn)換為一個(gè)DataFrame。由于數(shù)值型數(shù)據(jù)仍然是字符串格式,所以我們希望將部分弄轉(zhuǎn)換為浮點(diǎn)數(shù)格式。
雖然可以手工實(shí)現(xiàn)該功能,但是pandas就有一個(gè)TextParser類可以自動(dòng)類型轉(zhuǎn)換(read_csv和其它解析函數(shù)其實(shí)在內(nèi)部都用到了它)
from pandas.io.parsers import TextParser def parse_option_data(table): rows=table.findall('.//tr') header=_unpack(rows[0],kind='th') data=[_unpack(r) for r in rows[1:]] return TextParser(data,names=header).get_chunk() aa=parse_option_data(table=tables) print DataFrame(aa)
利用lxml.objectify解析xml: 可具體看另一篇專門介紹xml解析文件
aa.xml的內(nèi)容如下:
<?xml version="1.0" ?> <zAppointments reminder="15"> <appointment> <begin>1181251680</begin> <uid>040000008200E000</uid> <alarmTime>1181572063</alarmTime> <state></state> <location></location> <duration>1800</duration> <subject>Bring pizza home</subject> </appointment> <appointment> <begin>1234360800</begin> <duration>1800</duration> <subject>Check MS Office website for updates</subject> <location></location> <uid>604f4792-eb89-478b-a14f-dd34d3cc6c21-1234360800</uid> <state>dismissed</state> </appointment> </zAppointments>
def parseXML(xmlFile): """ Parse the xml :param xmlFile: :return: """ f=open(xmlFile) #1.先打開文件 xml=f.read() #2.讀取文件內(nèi)容 f.close() tree=etree.parse(StringIO(xml)) #3.用etree.parse解析xml文件的樹結(jié)構(gòu) context=etree.iterparse(StringIO(xml)) #4.etree.iterparse迭代解析xml文件的內(nèi)容 for action,elem in context: if not elem.text: text="None" else: text=elem.text print elem.tag+"=>"+text if __name__=="__main__": parseXML("aa.xml")
def parseXML(xmlFile): """ Parse the xml :param xmlFile: :return: """ f=open(xmlFile) xml=f.read() f.close() tree=etree.parse(StringIO(xml)) context=etree.iterparse(StringIO(xml)) for action,elem in context: if not elem.text: text="None" else: text=elem.text print elem.tag+"=>"+text if __name__=="__main__": parseXML("aa.xml") #輸出結(jié)果如下: # begin = > 1181251680 # uid = > 040000008200E000 # alarmTime = > 1181572063 # state = > None # location = > None # duration = > 1800 # subject = > Bring # pizza # home # appointment = > # # begin = > 1234360800 # duration = > 1800 # subject = > Check # MS # Office # website # for updates # location = > None # uid = > 604 # f4792 - eb89 - 478 # b - a14f - dd34d3cc6c21 - 1234360800 # state = > dismissed # appointment = > # # zAppointments = >
2.二進(jìn)制數(shù)據(jù)格式:寫入與讀取
(1)使用python內(nèi)置的pickle序列化讀取和存儲(chǔ)數(shù)據(jù)
實(shí)現(xiàn)數(shù)據(jù)的二進(jìn)制格式存儲(chǔ)最簡(jiǎn)單的辦法之一是使用python內(nèi)置的pickle序列化。
為了使用方便,pandas對(duì)象都有一個(gè)用于將數(shù)據(jù)以pickle形式保存到磁盤上的to_pickle方法。
相反,從磁盤上讀取read_pickle。
import pandas as pd import numpy as np from pandas import Series,DataFrame #二進(jìn)制數(shù)據(jù)格式保存 frame=pd.read_csv('ex1.csv') print frame #輸出結(jié)果如下: # a b c d message # 0 1 2 3 4 hello # 1 5 6 7 8 world # 2 9 10 11 12 foo (1)可用to_pickle保存到磁盤 frame.to_pickle('frame_pickle') (2)還有一個(gè)也很好用的pickle函數(shù)pandas.load將數(shù)據(jù)讀回到python,load也沒有了,現(xiàn)在是read_pickle讀取數(shù)據(jù) # pd.load('frame_pickle') #load已經(jīng)不能用了,現(xiàn)在是read_pickle print pd.read_pickle('frame_pickle')
警告:pickle僅建議用于短期存儲(chǔ)格式。其原因是很難保證格式永遠(yuǎn)是穩(wěn)定的。
今天的pickle的對(duì)象無法被后續(xù)版本的庫unpickle出來。
(2)使用HDF5格式實(shí)現(xiàn)高效讀寫磁盤上以二進(jìn)制格式存儲(chǔ)的科學(xué)數(shù)據(jù)。
HDF5支持多種壓縮器的即時(shí)壓縮,能更高效地存儲(chǔ)重復(fù)模式數(shù)據(jù),對(duì)于那些非常大的無法直接放入內(nèi)存的數(shù)據(jù)集,
HDF5就是不錯(cuò)的選擇,因?yàn)樗梢愿咝У胤謮K讀寫。
python中的HDF5庫有兩個(gè)接口(即PyTables和h5py),h5py提供了一種直接而高級(jí)的HDF5 API訪問接口,
而PyTables則抽象了HDF5的許多細(xì)節(jié)以提供多種靈活的數(shù)據(jù)容器、表索引、查詢功能以及對(duì)核外計(jì)算技術(shù)的某些支持。
import pandas as pd import numpy as np from pandas import Series,DataFrame import matplotlib.pyplot as plt import tables #二進(jìn)制數(shù)據(jù)格式保存 frame=pd.read_csv('ex1.csv') print frame #輸出結(jié)果如下: # a b c d message # 0 1 2 3 4 hello # 1 5 6 7 8 world # 2 9 10 11 12 foo #兩個(gè)函數(shù)用于生成數(shù)據(jù) random_state = np.random.RandomState(1999) def make_random_cluster_points(n_samples, random_state=random_state): mu_options = np.array([(-1, -1), (1, 1), (1, -1), (-1, 1)]) sigma = 0.2 mu_choices = random_state.randint(0, len(mu_options), size=n_samples) means = mu_options[mu_choices] return means + np.random.randn(n_samples, 2) * sigma, mu_choices def plot_clusters(data, clusters, name): plt.figure() colors = ["#9b59b6", "#3498db", "#e74c3c", "#2ecc71"] for i in np.unique(clusters): plt.scatter(data[clusters==i, 0], data[clusters==i, 1], color=colors[i]) plt.axis('off') plt.title('Plot from %s' % name) #(1)數(shù)據(jù)寫入到磁盤:open_file(文件名,'w'),create_array() data, clusters = make_random_cluster_points(10000) plot_clusters(data, clusters, "data in memory") # plt.show() #畫圖展示 #PyTables存儲(chǔ)數(shù)據(jù)到磁盤 sample_data,sample_clusters=make_random_cluster_points(10000) #調(diào)用函數(shù)生成數(shù)據(jù) hdf5_path="my_data.hdf5" #寫入的文件名 hdf5_file=tables.open_file(hdf5_path,mode='w') data_storage=hdf5_file.create_array(hdf5_file.root,'data',sample_data) #hdf5_file.root即"/",data為創(chuàng)建array文件名相當(dāng)于"/data",data里存儲(chǔ)的是sample_data的數(shù)據(jù).data像文件名 clusters_storage=hdf5_file.create_array(hdf5_file.root,'clusters',sample_clusters) hdf5_file.close() #(2)數(shù)據(jù)的讀取:open_file(文件名,'r'),hdf5_file.root.data[:] hdf5_path="my_data.hdf5" read_hdf5_file=tables.open_file(hdf5_path,mode='r') hdf5_data=read_hdf5_file.root.data[:] #讀取read_hdf5_file根目錄下的數(shù)據(jù)名稱為data的全部數(shù)據(jù) hdf5_clusters=read_hdf5_file.root.clusters[:] #讀取read_hdf5_file根目錄下的數(shù)據(jù)名稱為clusters的全部數(shù)據(jù) read_hdf5_file.close() plot_clusters(hdf5_data,hdf5_clusters,"PyTables Array") plt.show()
注意:HDF5不是數(shù)據(jù)庫。它最適合用作”一次寫多次讀“的數(shù)據(jù)集。雖然數(shù)據(jù)可以在任何時(shí)候被添加到文件中,
但如果同時(shí)發(fā)生多個(gè)寫操作,文件就可能會(huì)被破壞。
(3)讀取Microsoft Excel文件
pandas的ExcelFile類文件讀取存儲(chǔ)在Excel中表格型數(shù)據(jù)。由于ExcelFile用到了(python讀取excel表格的包)xlrd和openpyxl包,所以先得安裝它們才行。
# 讀取excel文件: xls_file=pd.ExcelFile('data.xls') #存放在某個(gè)工作表中的數(shù)據(jù)可以通過parse讀取到DataFrame中 table=xls_file.parse('Sheet1')
3.使用HTML和Web API:request包中的get來讀取數(shù)據(jù)
import pandas as pd import numpy as np from pandas import Series,DataFrame import matplotlib.pyplot as plt import tables import requests import json # url='https://twitter.com/search?q=python+pandas' url='https://twitter.com/search?q=python%20pandas&src=typd' resp=requests.get(url) print resp.text data=json.loads(resp.text) #將resp轉(zhuǎn)化成json格式 print data print data.keys() #用一個(gè)列表定義出感興趣的tweet字段,然后將results列表傳給DataFrame: tweet_fields=['created_at','from_user','id','text'] tweets=DataFrame(data['result'],columns=tweet_fields) print tweets.ix[7]
4.使用數(shù)據(jù)庫
sqlite3數(shù)據(jù)庫:讀取數(shù)據(jù)庫數(shù)據(jù)
import pandas as pd import numpy as np from pandas import Series,DataFrame import matplotlib.pyplot as plt import tables import requests import json import sqlite3 (1)數(shù)據(jù)連接 query=""" CREATE TABLE test (a VARCHAR (20),b VARCHAR (20), c REAL, d INTEGER ); """ con=sqlite3.connect(':memory:') con.execute(query) con.commit() (2)插入數(shù)據(jù) data=[('Atlanta','Georgia',1.25,6), ('Tallahassee','Florida',2.6,3), ('Sacramento','California',1.7,5)] stmt='INSERT INTO test VALUES(?,?,?,?)' con.executemany(stmt,data) con.commit() #查詢數(shù)據(jù),即讀取數(shù)據(jù)庫數(shù)據(jù) cursor=con.execute('select * from test') rows=cursor.fetchall() print rows #輸出結(jié)果如下:sqlite3取出的是列表 [(u'Atlanta', u'Georgia', 1.25, 6), (u'Tallahassee', u'Florida', 2.6, 3), (u'Sacramento', u'California', 1.7, 5)] (3)可以將這個(gè)元組列表傳給DataFrame的構(gòu)造器,但還需要列名(位于游標(biāo)的description屬性中) print cursor.description #輸出結(jié)果如下: (('a', None, None, None, None, None, None), ('b', None, None, None, None, None, None), ('c', None, None, None, None, None, None), ('d', None, None, None, None, None, None)) (4)轉(zhuǎn)換為DataFrame result=DataFrame(rows,columns=zip(*cursor.description)[0]) print result #輸出結(jié)果如下: # a b c d # 0 Atlanta Georgia 1.25 6 # 1 Tallahassee Florida 2.60 3 # 2 Sacramento California 1.70 5 (5)上面的方法每查一次就得寫一次,pandas有一個(gè)可以簡(jiǎn)化該過程的read_sql函數(shù)(位于pandas.io.sql模塊)。 # 只需傳入select語句和連接對(duì)象即可。 import pandas.io.sql as sql # print sql.read_sql('select * from test',con) #或者直接用pd.read_sql不用先引入sql也一樣的 df= pd.read_sql('select * from test',con) #輸出結(jié)果如下: # a b c d # 0 Atlanta Georgia 1.25 6 # 1 Tallahassee Florida 2.60 3 # 2 Sacramento California 1.70 5 aa=DataFrame(df) print aa
mysql數(shù)據(jù)庫:讀取數(shù)據(jù)庫數(shù)據(jù)
#讀取mysql中的數(shù)據(jù) import pymysql import configparser config =configparser (1)連接數(shù)據(jù)庫 db=pymysql.connect("localhost","root", "root","imooc") cursor=db.cursor() #使用游標(biāo)創(chuàng)建一個(gè)游標(biāo)對(duì)象 (2)使用execute()方法執(zhí)行sql查詢 cursor.execute("select * from test1") data=cursor.fetchall() print data #輸出結(jié)果如下:4條數(shù)據(jù),mysql取出的形式是元組 # ((1, 'tang seng', 79, 'xi tian qu jing', '11783213,131313133,78271783918'), # (2, 'zhu ba jie', 61, 'xi tian qu jing', '787138912,83918933'), # (3, 'sun wu kong', 91, 'ji tian da sheng', '1378219389,17898932183,1841898344,1989839898'), # (4, 'sha seng', 71, 'xi tian qu jing', '1649281938,15089328109')) # (3)列名信息在cursor.description中,及列的其它信息也在 print cursor.description # #查看結(jié)果如下: # ((u'id', 3, None, 11, 11, 0, 0), # (u'user_name', 253, None, 20, 20, 0, 1), # (u'score', 3, None, 2, 2, 0, 1), # (u'over', 253, None, 40, 40, 0, 1), # (u'mobile', 253, None, 100, 100, 0, 1)) print type(zip(*cursor.description)[0]) (4)將data放入DataFrame中,pandas必須是list才可以轉(zhuǎn)化為DataFrame,而此處的Data是元組,故先轉(zhuǎn)化為list才可以用 result=DataFrame(list(data),columns=zip(*cursor.description)[0]) print result #輸出結(jié)果如下: # id user_name score over \ # 0 1 tang seng 79 xi tian qu jing # 1 2 zhu ba jie 61 xi tian qu jing # 2 3 sun wu kong 91 ji tian da sheng # 3 4 sha seng 71 xi tian qu jing # # mobile # 0 11783213,131313133,78271783918 # 1 787138912,83918933 # 2 1378219389,17898932183,1841898344,1989839898 # 3 1649281938,15089328109 (5)可以用read_sql一次性獲取: import pandas.io.sql as sql result=sql.read_sql('select * from test1',db) print result #輸出結(jié)果如下: # id user_name score over \ # 0 1 tang seng 79 xi tian qu jing # 1 2 zhu ba jie 61 xi tian qu jing # 2 3 sun wu kong 91 ji tian da sheng # 3 4 sha seng 71 xi tian qu jing # # mobile # 0 11783213,131313133,78271783918 # 1 787138912,83918933 # 2 1378219389,17898932183,1841898344,1989839898 # 3 1649281938,15089328109 db.close()
注意:(1)DataFrame接受轉(zhuǎn)換的是list形式:sqlit3用fetchall取出的是列表,所以可以直接放在DataFrame中,而mysql取出來的是元組,故要先轉(zhuǎn)化成list.
mongoDB數(shù)據(jù)庫:讀取數(shù)據(jù)庫數(shù)據(jù)
NoSQL數(shù)據(jù)庫有許多不同的形式。有些是簡(jiǎn)單的字典式鍵值對(duì)存儲(chǔ),另一些則是基于文檔的(其中的基本單元是字典型的對(duì)象)。
from pandas import Series,DataFrame import pymongo import datetime # import configparser # config =configparser (1)mongodb數(shù)據(jù)庫的連接 con=pymongo.MongoClient('localhost',port=27017) (2)創(chuàng)建數(shù)據(jù)庫 # tweets=con.test_database (3)創(chuàng)建集合:一組文件存儲(chǔ)在mongodb中,相當(dāng)于數(shù)據(jù)庫的各個(gè)表 # collection=tweets.test_collection post = {"author": "Mike", "text": "My first blog post!", "tags": ["mongodb", "python", "pymongo"], "date": datetime.datetime.utcnow()} (4)插入文件 posts=tweets.posts post_id=posts.insert_one(post).inserted_id (5)查詢相關(guān)的數(shù)據(jù) import pprint pprint.pprint(posts.find_one({"author":"Mike"})) (6)字典放入DataFrame中 p=DataFrame(post,columns=post.keys()) print p
以上這篇python用pandas數(shù)據(jù)加載、存儲(chǔ)與文件格式的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Python實(shí)現(xiàn)從文件中加載數(shù)據(jù)的方法詳解
- Python 保存加載mat格式文件的示例代碼
- python3+selenium獲取頁面加載的所有靜態(tài)資源文件鏈接操作
- python GUI庫圖形界面開發(fā)之PyQt5動(dòng)態(tài)加載QSS樣式文件
- 解決Python 使用h5py加載文件,看不到keys()的問題
- Python加載帶有注釋的Json文件實(shí)例
- Python實(shí)現(xiàn)加載及解析properties配置文件的方法
- python web基礎(chǔ)之加載靜態(tài)文件實(shí)例
- python:關(guān)于文件加載及處理方式
相關(guān)文章
Python?Pexpect庫自動(dòng)化交互式進(jìn)程控制的expect_list方法解析
Pexpect是一個(gè)Python庫,為自動(dòng)化和交互式進(jìn)程控制提供了豐富的功能,而expect_list方法是其功能強(qiáng)大且靈活的一部分,將詳細(xì)探討如何使用這一方法,并提供多個(gè)示例來說明其應(yīng)用場(chǎng)景和功能2024-01-01python控制nao機(jī)器人身體動(dòng)作實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了python控制nao機(jī)器人身體動(dòng)作實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04Python Matplotlib繪圖基礎(chǔ)知識(shí)代碼解析
這篇文章主要介紹了Python Matplotlib繪圖基礎(chǔ)知識(shí)代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08