Pandas是python的一個(gè)數(shù)據(jù)分析包撵渡,最初由AQR Capital Management于2008年4月開發(fā)融柬,并于2009年底開源出來(lái),目前由專注于Python數(shù)據(jù)包開發(fā)的PyData開發(fā)team繼續(xù)開發(fā)和維護(hù)趋距,屬于PyData項(xiàng)目的一部分粒氧。Pandas最初被作為金融數(shù)據(jù)分析工具而開發(fā)出來(lái),因此节腐,pandas為時(shí)間序列分析提供了很好的支持外盯。 Pandas的名稱來(lái)自于面板數(shù)據(jù)(panel data)和python數(shù)據(jù)分析(data analysis)。panel data是經(jīng)濟(jì)學(xué)中關(guān)于多維數(shù)據(jù)集的一個(gè)術(shù)語(yǔ)翼雀,在Pandas中也提供了panel的數(shù)據(jù)類型饱苟。(下面的表格只能截圖了,mweb編輯的文章不能直接發(fā)布到簡(jiǎn)書)
pandas數(shù)據(jù)結(jié)構(gòu)
①Series:一維數(shù)組狼渊,與Numpy中的一維array類似箱熬。二者與Python基本的數(shù)據(jù)結(jié)構(gòu)List也很相近,其區(qū)別是:_List中的元素可以是不同的數(shù)據(jù)類型狈邑,而Array和Series中則只允許存儲(chǔ)相同的數(shù)據(jù)類型城须,這樣可以更有效的使用內(nèi)存,提高運(yùn)算效率官地。_
②Time- Series:以時(shí)間為索引的Series酿傍。
③DataFrame:二維的表格型數(shù)據(jù)結(jié)構(gòu)。很多功能與R中的data.frame類似驱入〕喑矗可以將DataFrame理解為Series的容器氯析。以下的內(nèi)容主要以DataFrame為主。
④Panel :三維的數(shù)組莺褒,可以理解為DataFrame的容器掩缓。
python本身的數(shù)據(jù)結(jié)構(gòu)
1. list
Python中最基本的數(shù)據(jù)結(jié)構(gòu)。序列中的每個(gè)元素都分配一個(gè)數(shù)字 - 它的位置遵岩,或索引你辣,第一個(gè)索引是0,第二個(gè)索引是1尘执,依此類推舍哄。可以使用append()方法來(lái)添加列表項(xiàng)誊锭”硇可以使用 del 語(yǔ)句來(lái)刪除列表的的元素。
2.元組
元組與列表類似丧靡,不同之處在于元組的元素不能修改蟆沫。
元組使用小括號(hào),列表使用方括號(hào)温治。
元組創(chuàng)建很簡(jiǎn)單饭庞,只需要在括號(hào)中添加元素,并使用逗號(hào)隔開即可熬荆。
元組中只包含一個(gè)元素時(shí)舟山,需要在元素后面添加逗號(hào);
元組可以使用下標(biāo)索引來(lái)訪問元組中的值:
tup2[1:5]: (2, 3, 4, 5)
元組中的元素值是不允許修改的惶看,但我們可以對(duì)元組進(jìn)行連接組合
元組中的元素值是不允許刪除的捏顺,但我們可以使用del語(yǔ)句來(lái)刪除整個(gè)元組
元組運(yùn)算
3.字典
字典是另一種可變?nèi)萜髂P停铱纱鎯?chǔ)任意類型對(duì)象纬黎。
字典的每個(gè)鍵值(key=>value)對(duì)用冒號(hào)(:)分割幅骄,每個(gè)對(duì)之間用逗號(hào)(,)分割,整個(gè)字典包括在花括號(hào)({})中
d = {key1 : value1, key2 : value2 }
鍵必須是唯一的本今,但值則不必拆座。
訪問字典里的值:把相應(yīng)的鍵放入熟悉的方括弧
向字典添加新內(nèi)容的方法是增加新的鍵/值對(duì),修改或刪除已有鍵/值對(duì)如下實(shí)例:
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
dict['Age'] = 8; # update existing entry
dict['School'] = "DPS School"; # Add new entry
能刪單一的元素也能清空字典冠息,清空只需一項(xiàng)操作挪凑。
Numpy數(shù)據(jù)結(jié)構(gòu)
1. ndarray 數(shù)組
* ndarray是一個(gè)通用的同構(gòu)數(shù)據(jù)多維容器,即所有元素必須是相同類型
* 每個(gè)數(shù)組都有一個(gè)shape(一個(gè)表示各維度大小的元組)和一個(gè)dtype(說明數(shù)組數(shù)據(jù)類型) NumPy數(shù)組的維數(shù)稱為秩(rank)逛艰,一維數(shù)組的秩為1躏碳,二維數(shù)組的秩為2 data=array([[1, 9, 6], [2, 8, 5], [3, 7, 4]])
基本的索引和切片
arr=np.arange(10)
arr[5:8]切片第6個(gè)到第8個(gè)元素
視圖上的任何修改都會(huì)直接反映到源數(shù)組上。如arr[5:8]=12,則源數(shù)組的第6到第8個(gè)元素都會(huì)賦值為12.
arr[5:8].copy() 切片副本
arr2d[:2,1:] 切片第0散怖,1行向量與第1菇绵,2列向量交組成的數(shù)組
names = np.array(['Bob','Joe'])
arr[names == 'Bob'] 布爾型索引
花式索引
arr = np.empty((8,4))
for i in range(8):
arr[i] = i
整數(shù)列索引 arr[[4,3,0,6]], arr[[-3,-5,-7]]
多個(gè)索引組
arr = np.arange(32).reshape((8,4))
arr[[1,5,7,2],[0,3,1,2]] 得到 array([4, 23, 29, 10])
arr[[1,5,7,2]][:,[0,3,1,2]]
得到
array([[4,7,5,6],
[20,23,21,22],
[28,31,29,30],
[8,11,9,10]])
np.ix_同樣可以得到以上結(jié)果
arr[np.ix_([1,5,7,2],[0,3,1,2])]
花式索引總是將數(shù)據(jù)復(fù)制到新數(shù)組中
其他方法和屬性
布爾值在計(jì)算過程中可以被當(dāng)做0或1處理
例如肄渗,result = 1* (cond1 -cond2) + 2*(cond2 & -cond1) + 3 * -(cond1 | cond2)
數(shù)組文件的輸入輸出
arr=np.arange(10)
np.save('some_array', arr) 將數(shù)組以二進(jìn)制格式,some_array.npy名稱保存在磁盤上咬最。
np.load('some_array.npy')加載
np.savez('array_archive.npz', a=arr, b=arr) 將多個(gè)數(shù)組保存在壓縮文件中
存取文本文件
arr = np.loadtxt('array_ex.txt',delimiter=',')將文件中數(shù)據(jù)加載到二維數(shù)組中
np.savetxt執(zhí)行相反操作
線性代數(shù)計(jì)算
x.dot(y) 相當(dāng)于np.dot(x,y)
inv(mat) 對(duì)可逆矩陣求逆
……
隨機(jī)數(shù)生成
?* numpy.random模塊
?* np.random.normal(size=(4,4))生成標(biāo)準(zhǔn)正態(tài)分布的4*4樣本數(shù)組
?* seed 確定隨機(jī)數(shù)生成器的種子
?* permutation 返回一個(gè)序列的隨機(jī)排列或返回一個(gè)隨機(jī)排列的范圍
?* shuffle 對(duì)一個(gè)序列就地隨機(jī)排列
?* rand 產(chǎn)生均勻分布的樣本值
?* randint 從給定的上下限范圍隨機(jī)取整數(shù)
pandas數(shù)據(jù)結(jié)構(gòu)
1.Series結(jié)構(gòu) 類似于一維數(shù)組的對(duì)象翎嫡,索引在左邊,值在右邊永乌,若不指定索引惑申,會(huì)自動(dòng)創(chuàng)建一個(gè)0~N-1的整數(shù)型索引 In: obj2 = Series([4,7,-5,3], index=['d','b','a','c']) Out: d 4 b 7 a -5 c 3
2.Pandas DataFrame結(jié)構(gòu) DataFrame是一個(gè)表格型數(shù)據(jù)結(jié)構(gòu),每列可以是不同的值類型(數(shù)值翅雏、字符串圈驼、布爾值等),它可以被看成由Series組成的字典枚荣,它既有行索引也有列索引碗脊。以一個(gè)或多個(gè)二維塊存放(而不是列表啼肩、字典或別的一維數(shù)據(jù)結(jié)構(gòu)) 構(gòu)建DataFrame的方法:
索引對(duì)象
1.pandas的索引對(duì)象負(fù)責(zé)管理軸標(biāo)簽和其他元數(shù)據(jù)(比如軸名稱等)橄妆。index對(duì)象是不可以修改的,這樣才能使index對(duì)象在多個(gè)數(shù)據(jù)結(jié)構(gòu)之間安全共享祈坠。
2.重新索引 reindex
? ?obj2 = obj.reindex(['a','b','c','d','e'])
? ?按照reindex新索引進(jìn)行重排害碾,如果某個(gè)索引值不存在,就引入缺失值赦拘,
? ? obj.reindex(['a','b','c','d','e'], fill_value=0), 將缺失值賦值為0
? ?使用ffill可以實(shí)現(xiàn)前向值填充:
? ?obj3 = Series(['blue','pureple','yellow'], index=[0,2,4])
? ?obj3.reindex(range(6),method='ffill')
? ?fill/pad 前向填充(或搬運(yùn))值
? ?bfill/backfill 后向填充值
如果只傳入一個(gè)序列則會(huì)重新索引行
使用columns關(guān)鍵字即可重新索引列:
frame.reindex(columns=states)
同時(shí)重新索引:frame.reindex(index=['a','b','c','d'], method='ffill', columns=states)
limit 前向或后向填充時(shí)的最大填充量
ix使重新索引更加簡(jiǎn)潔:frame.ix[['a','b','c','d'],states]
1.其他功能
2.匯總和計(jì)算描述統(tǒng)計(jì)
缺失值處理
層次化索引
data=Series(np.random.randn(10),index=[['a','a','a','b','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,2,3]] In: data.index Out: Multiindex[('a',1),('a',2)....] 層次化索引在數(shù)據(jù)重塑和基于分組的操作(如透視表生成)中扮演著重要角色慌随, data.unstack()轉(zhuǎn)化為一個(gè)DataFrame,其逆運(yùn)算是stack data.unstack().stack()
對(duì)于DataFrame每條軸都可以有分層索引
frame = DataFrame(np.arange(12).reshape((4,3)), index=[['a','a','b','b'],[1,2,1,2]],columns=[['Ohio','Ohio','Colorado'],['Green','Red','Green']])
數(shù)據(jù)加載躺同、存儲(chǔ)與文件格式
1. 讀寫文本格式數(shù)據(jù)
2.逐塊讀取文本文件?
在處理很大的文件時(shí)阁猜,可能只想讀取文件的一小部分或逐塊對(duì)文件進(jìn)行迭代 pd.read_csv(‘ch06/ex6.csv’, nrow=5) 只讀取幾行 chunker=pd.read_csv(‘ch06/ex6.csv’,chunksize=1000) #設(shè)置每次處理行數(shù)
tot = Series([])
for piece in chunker:
tot = tot.add(piece['key'].value_counts(), fill_value=0)
tot =tot.ordr(ascending=False)
3.將數(shù)據(jù)寫出到文本格式?
data.to_csv('ch06/out.csv') data.to_csv(sys.stout, sep='|') #指定分隔符?
data.to_csv(sys.stout, na_rep='NULL')
4.手工處理分隔符格式
直接使用Python內(nèi)置的csv模塊
import csv
f = open('cho6/ex7.csv')
reader = csv.reader(f)
for line in reader:
print line
這樣得到一系列列表
為時(shí)數(shù)據(jù)格式合乎要求,做如下操作
lines = list(csv.reader(open('cho6/ex7.csv')))
header, values = lines[0],lines[1:]
data_dict = {h: v for h, v in zip(header, zip(*values))}
定義子類處理各種分隔符:
class my_dialect(csv.Dialect):
lineterminator = '\n'
delimiter = ';'
quotechar = '"'
reader = csv.reader(f, diaect=my_dialect)
JSON數(shù)據(jù)
JSON= JavaScript Object Notation
1.加載json數(shù)據(jù)
result=json.loads(obj)
2.將Python對(duì)象轉(zhuǎn)為json格式
asjson=json.dumps(result)
3.轉(zhuǎn)換為DataFrame結(jié)構(gòu)
siblings = DataFrame(result['siblings'],columns=['name','age'])
4.web信息收集
from lxml.html import parse
from urllib2 import urlopen
parsed =parse(urlopen('http://www.baidu.com'))
doc = parsed.getroot()
獲取該頁(yè)面的所有URL
urls = [lnk.get('href') for lnk in doc.findall('.//a')]
a.pop() # 把最后一個(gè)值4從列表中移除并作為pop的返回值
a.append(5) # 末尾插入值蹋艺,[1, 2, 3, 5]
a.index(2) # 找到第一個(gè)2所在的位置剃袍,也就是1
a[2] # 取下標(biāo),也就是位置在2的值捎谨,也就是第三個(gè)值3
a += [4, 3, 2] # 拼接民效,[1, 2, 3, 5, 4, 3, 2]
a.insert(1, 0) # 在下標(biāo)為1處插入元素0,[1, 0, 2, 3, 5, 4, 3, 2]
a.remove(2) # 移除第一個(gè)2涛救,[1, 0, 3, 5, 4, 3, 2]
a.reverse() # 倒序畏邢,a變?yōu)閇2, 3, 4, 5, 3, 0, 1]
a[3] = 9 # 指定下標(biāo)處賦值,[2, 3, 4, 9, 3, 0, 1]
b = a[2:5] # 取下標(biāo)2開始到5之前的子序列检吆,[4, 9, 3]
c = a[2:-2] # 下標(biāo)也可以倒著數(shù)舒萎,方便算不過來(lái)的人,[4, 9, 3]
d = a[2:] # 取下標(biāo)2開始到結(jié)尾的子序列蹭沛,[4, 9, 3, 0, 1]
e = a[:5] # 取開始到下標(biāo)5之前的子序列臂寝,[2, 3, 4, 9, 3]
f = a[:] # 取從開頭到最后的整個(gè)子序列虱肄,相當(dāng)于值拷貝,[2, 3, 4, 9, 3, 0, 1]
a[2:-2] = [1, 2, 3] # 賦值也可以按照一段來(lái)交煞,[2, 3, 1, 2, 3, 0, 1]
g = a[::-1] # 也是倒序咏窿,通過slicing實(shí)現(xiàn)并賦值,效率略低于reverse()
a.sort()
print(a) # 列表內(nèi)排序素征,a變?yōu)閇0, 1, 1, 2, 2, 3, 3]