在學(xué)習(xí)了Numpy后,進(jìn)行數(shù)據(jù)科學(xué)計(jì)算,為何還要使用Pandas呢?其實(shí)原因就是效率高,那為何Pandas效率比numpy要高呢?其實(shí)Pandas和Numpy還是有著很大的關(guān)系的,Pandas本身是依賴numpy的,而ndarray在內(nèi)存里占據(jù)這一段連續(xù)的內(nèi)存空間,任何改變ndarray長(zhǎng)度的操作都勢(shì)必讓所有value改變內(nèi)存中的位置因此在某種程度上,Numpy操作效率還是比較慢的。但是Pandas并不是處理所有的數(shù)據(jù)都是效率很高的,那么一般情況下處理以下的數(shù)據(jù)比較友好:
Series:類似于一維數(shù)組的對(duì)象,由一組數(shù)據(jù)以及一組相關(guān)的數(shù)據(jù)標(biāo)簽組成的數(shù)據(jù)結(jié)構(gòu)??梢詫eries看成是一個(gè)定長(zhǎng)的有序字典,因?yàn)樗撬饕档綌?shù)據(jù)值的一個(gè)映射。
獲取索引對(duì)象——obj.index
eg:# 第一種創(chuàng)建series的方式: s1 = pd.Series([1,2,3,4,5,6,7,8,9]) print(s1) print(s1.values) # series的值 print(s1.index) # 索引信息# 第二種創(chuàng)建series方式: s2 = pd.Series(np.arange(10)) print(s2)# 第三種通過字典的方式創(chuàng)建series: s3 = pd.Series({"cecilia":90,'cc':89,'abc':97}) print(s3) print(s3.index) s4 = pd.Series(s1.to_dict()) # 轉(zhuǎn)字典 print(s4) s5 = pd.isnull(s3) s5.index.name = "name score" # 給列名添加名稱 print(s5)
通過索引存取元素
>>>obj2 = pd.Series([4, 7,-5,3], index=['d','b','a','c']) #還能自定義index進(jìn)行創(chuàng)建Series>>>obj2d 4b 7a -5c 3dtype: int64>>> obj2.indexIndex([u'd', u'b', u'a', u'c'], dtype='object')## 通過索引存取元素和修改元素值>>>obj2['d']= 6 # 修改index='d'的索引值d 6b 7a -5c 3dtype: int64>>>obj2[['c','a','d']] ## 選取index='c' 'a' 'd'的元素值c 3a -5d 6dtype: int64## 按照索引條件獲取元素>>>obj2[obj2>0]d 6b 7c 3dtype: int64
DataFrame:是一個(gè)table型數(shù)據(jù),包含一組有序的列,每列可以是不同的值類型,DataFrame既有行索引也有列索引,可以看作是由Series組成的字典。dataFrame中的數(shù)據(jù)是以一個(gè)或者多個(gè)二維塊存放的,而不是列表、字典等。
創(chuàng)建DataFrame
eg:>>> data = {'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]}>>> df = pd.DataFrame(data)>>> print(df) a b c0 1 4 71 2 5 82 3 6 9注意:結(jié)果DataFrame會(huì)自動(dòng)加上索引(跟Series一樣),且全部列會(huì)被有序悱列!??!## 如果指定了列序列,則DataFrame的列就會(huì)按照指定順序迸行排列,如果指定的列不存在,那么結(jié)果是一個(gè)空的dataframe>>>pd.DataFrame(data, columns=['b', 'a', 'c']) b a c0 4 1 71 5 2 82 6 3 9
存取元素(其實(shí)是一個(gè)Series)
注意:
## 通過字典標(biāo)記或者屬性來獲取Series>>> data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada'], 'year':[2000, 2001, 2002, 2001, 2002], 'pop':[1.5, 1.7, 3.6, 2.4, 2.9]}>>> df= pd.DataFrame(data, columns=['year', 'state', 'pop'])>>> print(df['state'])0 Ohio1 Ohio2 Ohio3 Nevada4 NevadaName: state, dtype: object
ix、loc、iloc
ix——可以通過行號(hào)索引,也可以通過行標(biāo)簽索引(從pandas 0.20.0版本開始,官方不推薦使用.ix方法,而是使用.iloc 和.loc方法)
loc——loc[‘d’]表示索引的是第’d’行(index 是字符)通過行標(biāo)簽索引行數(shù)據(jù),也可以索引某行某列
iloc——通過行號(hào)獲取行數(shù)據(jù)或者多行數(shù)據(jù),但是通過行標(biāo)簽獲取會(huì)報(bào)錯(cuò)
## 承接上面的df>> print(df.loc[1]) # 選取第一行的數(shù)據(jù)state Ohioyear 2001pop 1.7Name: 1, dtype: object>> print(df.loc[0:2]) # 選取index=0到index=2行的數(shù)據(jù),總共三行數(shù)據(jù) state year pop0 Ohio 2000 1.51 Ohio 2001 1.72 Ohio 2002 3.6## 可以鎖定行,按照特征屬性多列選取元素>> num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']>> bar_heights = norm_data.loc[0, num_cols].values>> print(bar_heights)[4.3 3.55 3.9 4.5 5.0]## 重置索引index,通過行號(hào)獲取數(shù)據(jù)>> df.reset_index(inplace=True)>> df.head()>> print(df.iloc[2:4]) # 獲取第2行、第3行數(shù)據(jù) index state year pop2 2 Ohio 2002 3.63 3 Nevada 2001 2.4
重建索引——reindex()函數(shù):將會(huì)根據(jù)新索引進(jìn)行重排。如果某個(gè)索引值當(dāng)前不存在,就引入缺失值,可以采用填充的方式處理缺失值
有幾種參數(shù):
參數(shù) 說明index 用作索引的新序列。既可以是index實(shí)例,也 可以是其他序列型的Python數(shù)據(jù)結(jié)構(gòu)。Index 會(huì)被完全使用,就像沒有任何復(fù)制一樣。method 插值(填充)方式。fill_value 在重新索引的過程中,需要引入缺失值時(shí)使用 的替代值 . limit 前向或后向填充時(shí)的最大填充量.level 在Multiindex的指定級(jí)別上匹配簡(jiǎn)單索引,否 則選取其子集copy 默認(rèn)為True,無論如何都復(fù)制;如果為False, 則新舊相等就不復(fù)制其中method方法的參數(shù)如下:參數(shù) 說明ffill或pad 前向填充(或搬運(yùn))值bfill或backfill 后向填充(或搬運(yùn))值
fill_value=0,直接填充0
apply函數(shù)——將函數(shù)應(yīng)用到由各列或行所形成的一維數(shù)組上,比如sum和mean等
eg:# 將求最大值和最小值之間的差得函數(shù)運(yùn)用在某一軸上>>>f = lambda x: x.max() - x.min()>>>frame.apply(f)>>>frame.apply(f, axis=1)
排名和排序
eg:>>>frame = DataFrame(np.arange(8).reshape((2, 4)), index=['three', 'one'], columns=['d','a','b','c'])>>>frame.sort_index()>>>frame.sort_index(axis=1)## 默認(rèn)的是升序排列,但也可以降序排列>>>frame.sort_index(axis=1, ascending=False)## 根據(jù)一個(gè)或多個(gè)列覺得值進(jìn)行排序,采用**by選項(xiàng)**>>>frame.sort_index(by=['three', 'one'])## 如要按照值對(duì)Series 進(jìn)行排序,那么可以order>>>obj = Series([4, 7, -3, 2])>>>obj.order()2 -33 20 41 7>>>obj = Series([4, np.nan, 1, np.nan, -3, 2])>>>obj.order() #在排序時(shí),缺失值默認(rèn)都會(huì)被放到Series的末尾.4 -32 15 20 41 NaNNaN
注意:排名(Series.rank(method='average',ascending=True))的作用與排序的不同之處在于,他會(huì)把對(duì)象的values替換成名次(從1 到 n)。這時(shí)唯一的問題在于如何處理平級(jí)項(xiàng),方法里的 method 參數(shù)就是起這個(gè)作用的,他有四個(gè)值可選:average,min, max, first。
匯總與統(tǒng)計(jì)
去除
填充
聯(lián)系客服