pandas與numpy數據結構

Pandas是python的一個數據分析包,最初由AQR Capital Management于2008年4月開發,并于2009年底開源出來,目前由專注于Python數據包開發的PyData開發team繼續開發和維護,屬于PyData項目的一部分。Pandas最初被作為金融數據分析工具而開發出來,因此,pandas為時間序列分析提供了很好的支持。 Pandas的名稱來自于面板數據(panel data)和python數據分析(data analysis)。panel data是經濟學中關于多維數據集的一個術語,在Pandas中也提供了panel的數據類型。(下面的表格只能截圖了,mweb編輯的文章不能直接發布到簡書)

pandas數據結構

①Series:一維數組,與Numpy中的一維array類似。二者與Python基本的數據結構List也很相近,其區別是:_List中的元素可以是不同的數據類型,而Array和Series中則只允許存儲相同的數據類型,這樣可以更有效的使用內存,提高運算效率。_

②Time- Series:以時間為索引的Series。

③DataFrame:二維的表格型數據結構。很多功能與R中的data.frame類似。可以將DataFrame理解為Series的容器。以下的內容主要以DataFrame為主。

④Panel :三維的數組,可以理解為DataFrame的容器。

python本身的數據結構

1. list

Python中最基本的數據結構。序列中的每個元素都分配一個數字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。可以使用append()方法來添加列表項。可以使用 del 語句來刪除列表的的元素。

list表達式
list包含的函數
list包含的方法

2.元組

元組與列表類似,不同之處在于元組的元素不能修改。

元組使用小括號,列表使用方括號。

元組創建很簡單,只需要在括號中添加元素,并使用逗號隔開即可。

元組中只包含一個元素時,需要在元素后面添加逗號;

元組可以使用下標索引來訪問元組中的值:

tup2[1:5]: (2, 3, 4, 5)

元組中的元素值是不允許修改的,但我們可以對元組進行連接組合

元組中的元素值是不允許刪除的,但我們可以使用del語句來刪除整個元組

元組運算


元組運算

3.字典

字典是另一種可變容器模型,且可存儲任意類型對象。

字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號({})中

d = {key1 : value1, key2 : value2 }

鍵必須是唯一的,但值則不必。

訪問字典里的值:把相應的鍵放入熟悉的方括弧

向字典添加新內容的方法是增加新的鍵/值對,修改或刪除已有鍵/值對如下實例:

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};

dict['Age'] = 8; # update existing entry

dict['School'] = "DPS School"; # Add new entry

能刪單一的元素也能清空字典,清空只需一項操作。

字典內置函數
字典內置方法

Numpy數據結構

1. ndarray 數組

* ndarray是一個通用的同構數據多維容器,即所有元素必須是相同類型

* 每個數組都有一個shape(一個表示各維度大小的元組)和一個dtype(說明數組數據類型) NumPy數組的維數稱為秩(rank),一維數組的秩為1,二維數組的秩為2 data=array([[1, 9, 6], [2, 8, 5], [3, 7, 4]])

ndarry屬性

基本的索引和切片

arr=np.arange(10)

arr[5:8]切片第6個到第8個元素

視圖上的任何修改都會直接反映到源數組上。如arr[5:8]=12,則源數組的第6到第8個元素都會賦值為12.

arr[5:8].copy() 切片副本

arr2d[:2,1:] 切片第0,1行向量與第1,2列向量交組成的數組

names = np.array(['Bob','Joe'])

arr[names == 'Bob'] 布爾型索引

花式索引

arr = np.empty((8,4))

for i in range(8):

arr[i] = i

整數列索引 arr[[4,3,0,6]], arr[[-3,-5,-7]]

多個索引組

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_同樣可以得到以上結果

arr[np.ix_([1,5,7,2],[0,3,1,2])]

花式索引總是將數據復制到新數組中

其他方法和屬性

其他方法和屬性

布爾值在計算過程中可以被當做0或1處理

例如,result = 1* (cond1 -cond2) + 2*(cond2 & -cond1) + 3 * -(cond1 | cond2)

數組文件的輸入輸出

arr=np.arange(10)

np.save('some_array', arr) 將數組以二進制格式,some_array.npy名稱保存在磁盤上。

np.load('some_array.npy')加載

np.savez('array_archive.npz', a=arr, b=arr) 將多個數組保存在壓縮文件中

存取文本文件

arr = np.loadtxt('array_ex.txt',delimiter=',')將文件中數據加載到二維數組中

np.savetxt執行相反操作

線性代數計算

x.dot(y) 相當于np.dot(x,y)

inv(mat) 對可逆矩陣求逆

……

隨機數生成

?* numpy.random模塊

?* np.random.normal(size=(4,4))生成標準正態分布的4*4樣本數組

?* seed 確定隨機數生成器的種子

?* permutation 返回一個序列的隨機排列或返回一個隨機排列的范圍

?* shuffle 對一個序列就地隨機排列

?* rand 產生均勻分布的樣本值

?* randint 從給定的上下限范圍隨機取整數

pandas數據結構

1.Series結構 類似于一維數組的對象,索引在左邊,值在右邊,若不指定索引,會自動創建一個0~N-1的整數型索引 In: obj2 = Series([4,7,-5,3], index=['d','b','a','c']) Out: d 4 b 7 a -5 c 3

series結構

2.Pandas DataFrame結構 DataFrame是一個表格型數據結構,每列可以是不同的值類型(數值、字符串、布爾值等),它可以被看成由Series組成的字典,它既有行索引也有列索引。以一個或多個二維塊存放(而不是列表、字典或別的一維數據結構) 構建DataFrame的方法:

DataFrame結構

索引對象

1.pandas的索引對象負責管理軸標簽和其他元數據(比如軸名稱等)。index對象是不可以修改的,這樣才能使index對象在多個數據結構之間安全共享。

2.重新索引 reindex

? ?obj2 = obj.reindex(['a','b','c','d','e'])

? ?按照reindex新索引進行重排,如果某個索引值不存在,就引入缺失值,

? ? obj.reindex(['a','b','c','d','e'], fill_value=0), 將缺失值賦值為0

? ?使用ffill可以實現前向值填充:

? ?obj3 = Series(['blue','pureple','yellow'], index=[0,2,4])

? ?obj3.reindex(range(6),method='ffill')

? ?fill/pad 前向填充(或搬運)值

? ?bfill/backfill 后向填充值

如果只傳入一個序列則會重新索引行

使用columns關鍵字即可重新索引列:

frame.reindex(columns=states)

同時重新索引:frame.reindex(index=['a','b','c','d'], method='ffill', columns=states)

limit 前向或后向填充時的最大填充量

ix使重新索引更加簡潔:frame.ix[['a','b','c','d'],states]

1.其他功能

2.匯總和計算描述統計

統計描述

缺失值處理

缺失值處理

層次化索引

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)....] 層次化索引在數據重塑和基于分組的操作(如透視表生成)中扮演著重要角色, data.unstack()轉化為一個DataFrame,其逆運算是stack data.unstack().stack()

對于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']])


數據加載、存儲與文件格式

1. 讀寫文本格式數據

讀寫文本格式數據

2.逐塊讀取文本文件?

在處理很大的文件時,可能只想讀取文件的一小部分或逐塊對文件進行迭代 pd.read_csv(‘ch06/ex6.csv’, nrow=5) 只讀取幾行 chunker=pd.read_csv(‘ch06/ex6.csv’,chunksize=1000) #設置每次處理行數

tot = Series([])

for piece in chunker:

tot = tot.add(piece['key'].value_counts(), fill_value=0)

tot =tot.ordr(ascending=False)

3.將數據寫出到文本格式?

data.to_csv('ch06/out.csv') data.to_csv(sys.stout, sep='|') #指定分隔符?

data.to_csv(sys.stout, na_rep='NULL')

4.手工處理分隔符格式

直接使用Python內置的csv模塊

import csv

f = open('cho6/ex7.csv')

reader = csv.reader(f)

for line in reader:

print line

這樣得到一系列列表

為時數據格式合乎要求,做如下操作

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數據

JSON= JavaScript Object Notation

1.加載json數據

result=json.loads(obj)

2.將Python對象轉為json格式

asjson=json.dumps(result)

3.轉換為DataFrame結構

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

獲取該頁面的所有URL

urls = [lnk.get('href') for lnk in doc.findall('.//a')]

a.pop() # 把最后一個值4從列表中移除并作為pop的返回值

a.append(5) # 末尾插入值,[1, 2, 3, 5]

a.index(2) # 找到第一個2所在的位置,也就是1

a[2] # 取下標,也就是位置在2的值,也就是第三個值3

a += [4, 3, 2] # 拼接,[1, 2, 3, 5, 4, 3, 2]

a.insert(1, 0) # 在下標為1處插入元素0,[1, 0, 2, 3, 5, 4, 3, 2]

a.remove(2) # 移除第一個2,[1, 0, 3, 5, 4, 3, 2]

a.reverse() # 倒序,a變為[2, 3, 4, 5, 3, 0, 1]

a[3] = 9 # 指定下標處賦值,[2, 3, 4, 9, 3, 0, 1]

b = a[2:5] # 取下標2開始到5之前的子序列,[4, 9, 3]

c = a[2:-2] # 下標也可以倒著數,方便算不過來的人,[4, 9, 3]

d = a[2:] # 取下標2開始到結尾的子序列,[4, 9, 3, 0, 1]

e = a[:5] # 取開始到下標5之前的子序列,[2, 3, 4, 9, 3]

f = a[:] # 取從開頭到最后的整個子序列,相當于值拷貝,[2, 3, 4, 9, 3, 0, 1]

a[2:-2] = [1, 2, 3] # 賦值也可以按照一段來,[2, 3, 1, 2, 3, 0, 1]

g = a[::-1] # 也是倒序,通過slicing實現并賦值,效率略低于reverse()

a.sort()

print(a) # 列表內排序,a變為[0, 1, 1, 2, 2, 3, 3]

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容