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 語句來刪除列表的的元素。
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]])
基本的索引和切片
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
2.Pandas DataFrame結構 DataFrame是一個表格型數據結構,每列可以是不同的值類型(數值、字符串、布爾值等),它可以被看成由Series組成的字典,它既有行索引也有列索引。以一個或多個二維塊存放(而不是列表、字典或別的一維數據結構) 構建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]