欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python用pandas數(shù)據(jù)加載、存儲(chǔ)與文件格式的實(shí)例

 更新時(shí)間:2018年12月07日 15:38:27   作者:jolingcome  
今天小編就為大家分享一篇python用pandas數(shù)據(jù)加載、存儲(chǔ)與文件格式的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

數(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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python通過websocket與js客戶端通信示例分析

    Python通過websocket與js客戶端通信示例分析

    網(wǎng)站大多使用 HTTP 協(xié)議通信,而 HTTP 是無連接的協(xié)議。只有客戶端請(qǐng)求時(shí),服務(wù)器端才能發(fā)出相應(yīng)的應(yīng)答, HTTP 請(qǐng)求的包也比較大,如果只是很小的數(shù)據(jù)通信,開銷過大。于是,我們可以使用 websocket 這個(gè)協(xié)議,用最小的開銷實(shí)現(xiàn)面向連接的通信。
    2014-06-06
  • Python?Pexpect庫自動(dòng)化交互式進(jìn)程控制的expect_list方法解析

    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-01
  • python控制nao機(jī)器人身體動(dòng)作實(shí)例詳解

    python控制nao機(jī)器人身體動(dòng)作實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了python控制nao機(jī)器人身體動(dòng)作實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Python正則表達(dá)式完全指南

    Python正則表達(dá)式完全指南

    正則表達(dá)式處理文本有如疾風(fēng)掃秋葉,絕大部分編程語言都內(nèi)置支持正則表達(dá)式,它應(yīng)用在諸如表單驗(yàn)證、文本提取、替換等場(chǎng)景。下文給大家?guī)砹藀ython正則表達(dá)式指南,需要的的朋友參考下吧
    2017-05-05
  • Python Matplotlib繪圖基礎(chǔ)知識(shí)代碼解析

    Python Matplotlib繪圖基礎(chǔ)知識(shí)代碼解析

    這篇文章主要介紹了Python Matplotlib繪圖基礎(chǔ)知識(shí)代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 解決python 使用openpyxl讀寫大文件的坑

    解決python 使用openpyxl讀寫大文件的坑

    這篇文章主要介紹了解決python 使用openpyxl讀寫大文件的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 對(duì)python多線程與global變量詳解

    對(duì)python多線程與global變量詳解

    今天小編就為大家分享一篇對(duì)python多線程與global變量詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python中qutip用法示例詳解

    Python中qutip用法示例詳解

    這篇文章主要給大家介紹了關(guān)于Python中qutip用法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • python集合是否可變總結(jié)

    python集合是否可變總結(jié)

    在本篇文章里小編給大家分享了關(guān)于python集合是否可變的相關(guān)知識(shí)點(diǎn)總結(jié),有需要的朋友們學(xué)習(xí)下。
    2019-06-06
  • Python 中制作偶數(shù)列表的方法

    Python 中制作偶數(shù)列表的方法

    這篇文章主要介紹了Python 中制作偶數(shù)列表的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05

最新評(píng)論