在學習了Numpy后,,進行數(shù)據(jù)科學計算,為何還要使用Pandas呢,?其實原因就是效率高,,那為何Pandas效率比numpy要高呢?其實Pandas和Numpy還是有著很大的關(guān)系的,,Pandas本身是依賴numpy的,,而ndarray在內(nèi)存里占據(jù)這一段連續(xù)的內(nèi)存空間,任何改變ndarray長度的操作都勢必讓所有value改變內(nèi)存中的位置因此在某種程度上,,Numpy操作效率還是比較慢的,。但是Pandas并不是處理所有的數(shù)據(jù)都是效率很高的,那么一般情況下處理以下的數(shù)據(jù)比較友好:
Pandas適合處理多種類型的數(shù)據(jù):
- 具有不同數(shù)據(jù)類型列的表格數(shù)據(jù)(DataFrame),,如SQL表或Excel電子表格,。
- 有序或無序(不固定頻率)的時間序列數(shù)據(jù)。
- 帶有行和列標簽的任意矩陣數(shù)據(jù),。
- 任何其他形式的觀測/統(tǒng)計數(shù)據(jù)集。
- Pandas主要包含三種數(shù)據(jù)結(jié)構(gòu),,分別是Series(一維),,DataFrame(二維),Panel(三維),。其中Series和DataFrame可以用于處理絕大多數(shù)金融,,統(tǒng)計,社會科學和許多工程領(lǐng)域的典型問題,。
Pandas庫是統(tǒng)計科學家在分析數(shù)據(jù)時的理想工具,,非常適合應(yīng)用于數(shù)據(jù)清洗,分析/建模,,然后將分析結(jié)果組織成適合于繪圖或表格顯示的形式的全部過程,。那么其中的優(yōu)勢在哪呢?
優(yōu)勢
- 可以輕易地處理浮點以及非浮點類型的數(shù)據(jù)的缺失值
- 大小可變:DataFrame和Panel都可以刪除和插入
- 靈活強大的分組功能,,可對數(shù)據(jù)集進行拆分組合
- 切片操作,,便于索引,存取數(shù)據(jù)
數(shù)據(jù)結(jié)構(gòu)
Series:類似于一維數(shù)組的對象,,由一組數(shù)據(jù)以及一組相關(guān)的數(shù)據(jù)標簽組成的數(shù)據(jù)結(jié)構(gòu),。可以將Series看成是一個定長的有序字典,,因為它是索引值到數(shù)據(jù)值的一個映射,。
- 創(chuàng)建Series方法——pd.Series
- 獲取數(shù)組表示形式——obj.values
獲取索引對象——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進行創(chuàng)建Series
>>>obj2
d 4
b 7
a -5
c 3
dtype: int64
>>> obj2.index
Index([u'd', u'b', u'a', u'c'], dtype='object')
## 通過索引存取元素和修改元素值
>>>obj2['d']= 6 # 修改index='d'的索引值
d 6
b 7
a -5
c 3
dtype: int64
>>>obj2[['c','a','d']] ## 選取index='c' 'a' 'd'的元素值
c 3
a -5
d 6
dtype: int64
## 按照索引條件獲取元素
>>>obj2[obj2>0]
d 6
b 7
c 3
dtype: int64
- 檢測缺失數(shù)據(jù)——pd.innull和pd.notnull
DataFrame:是一個table型數(shù)據(jù),包含一組有序的列,每列可以是不同的值類型,,DataFrame既有行索引也有列索引,,可以看作是由Series組成的字典。dataFrame中的數(shù)據(jù)是以一個或者多個二維塊存放的,,而不是列表,、字典等。
創(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 c
0 1 4 7
1 2 5 8
2 3 6 9
注意:結(jié)果DataFrame會自動加上索引(跟Series一樣),,且全部列會被有序悱列?。?!
## 如果指定了列序列,,則DataFrame的列就會按照指定順序迸行排列,如果指定的列不存在,那么結(jié)果是一個空的dataframe
>>>pd.DataFrame(data, columns=['b', 'a', 'c'])
b a c
0 4 1 7
1 5 2 8
2 6 3 9
存取元素(其實是一個Series)
注意:
- 返冋的Series擁有原DataFrame相同的索引,,且其name屬性也已經(jīng)被相應(yīng)地設(shè)置 好了,。行也可以通過位置或名稱的方式進行獲取。
- 如果采用非整數(shù)切片的方式進行選取數(shù)據(jù),,那么末端的索引對應(yīng)的數(shù)據(jù)是包含在內(nèi)的,,而整數(shù)切片索引,其末端的索引對應(yīng)的數(shù)據(jù)是“含前不含后”,。
## 通過字典標記或者屬性來獲取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 Ohio
1 Ohio
2 Ohio
3 Nevada
4 Nevada
Name: state, dtype: object
ix,、loc、iloc
ix——可以通過行號索引,,也可以通過行標簽索引(從pandas 0.20.0版本開始,,官方不推薦使用.ix方法,而是使用.iloc 和.loc方法)
loc——loc[‘d’]表示索引的是第’d’行(index 是字符)通過行標簽索引行數(shù)據(jù),,也可以索引某行某列
iloc——通過行號獲取行數(shù)據(jù)或者多行數(shù)據(jù),,但是通過行標簽獲取會報錯
## 承接上面的df
>> print(df.loc[1]) # 選取第一行的數(shù)據(jù)
state Ohio
year 2001
pop 1.7
Name: 1, dtype: object
>> print(df.loc[0:2]) # 選取index=0到index=2行的數(shù)據(jù),總共三行數(shù)據(jù)
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 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,,通過行號獲取數(shù)據(jù)
>> df.reset_index(inplace=True)
>> df.head()
>> print(df.iloc[2:4]) # 獲取第2行、第3行數(shù)據(jù)
index state year pop
2 2 Ohio 2002 3.6
3 3 Nevada 2001 2.4
重建索引——reindex()函數(shù):將會根據(jù)新索引進行重排,。如果某個索引值當前不存在,,就引入缺失值,可以采用填充的方式處理缺失值
有幾種參數(shù):
參數(shù) 說明
index 用作索引的新序列,。既可以是index實例,,也
可以是其他序列型的Python數(shù)據(jù)結(jié)構(gòu)。Index
會被完全使用,,就像沒有任何復制一樣,。
method 插值(填充)方式。
fill_value 在重新索引的過程中,需要引入缺失值時使用
的替代值 .
limit 前向或后向填充時的最大填充量.
level 在Multiindex的指定級別上匹配簡單索引,,否
則選取其子集
copy 默認為True,,無論如何都復制;如果為False,,
則新舊相等就不復制
其中method方法的參數(shù)如下:
參數(shù) 說明
ffill或pad 前向填充(或搬運)值
bfill或backfill 后向填充(或搬運)值
fill_value=0,,直接填充0
- 刪除任意軸上的索引值——drop(index,axis=1/0)
apply函數(shù)——將函數(shù)應(yīng)用到由各列或行所形成的一維數(shù)組上,比如sum和mean等
eg:
# 將求最大值和最小值之間的差得函數(shù)運用在某一軸上
>>>f = lambda x: x.max() - x.min()
>>>frame.apply(f)
>>>frame.apply(f, axis=1)
排名和排序
- sort_index——對行或列索引進行排序 (按字典順序)
- order——針對按照值Series排序
- rank——排名,,默認情況下,,rank是通過“為各組分配一個平均排名”的方式破壞平級關(guān)系的
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)
## 默認的是升序排列,但也可以降序排列
>>>frame.sort_index(axis=1, ascending=False)
## 根據(jù)一個或多個列覺得值進行排序,,采用**by選項**
>>>frame.sort_index(by=['three', 'one'])
## 如要按照值對Series 進行排序,,那么可以order
>>>obj = Series([4, 7, -3, 2])
>>>obj.order()
2 -3
3 2
0 4
1 7
>>>obj = Series([4, np.nan, 1, np.nan, -3, 2])
>>>obj.order() #在排序時,缺失值默認都會被放到Series的末尾.
4 -3
2 1
5 2
0 4
1 NaN
NaN
注意:排名(Series.rank(method='average',ascending=True))的作用與排序的不同之處在于,,他會把對象的values替換成名次(從1 到 n),。這時唯一的問題在于如何處理平級項,方法里的 method 參數(shù)就是起這個作用的,,他有四個值可選:average,min, max, first,。
匯總與統(tǒng)計
- sum(axis=1/0)——axis=1按照行求和
- mean(axis=1, skipna=False)——skipna選項可以避免行列存在NA得值進行計算
- idxmin和idxmax,達到最小值或最大值的索引
- describe——用于一次性匯總統(tǒng)計
處理缺失數(shù)據(jù)得方式
來源:https://www./content-1-395101.html
|