功能包括但不限于:
1.按軸自動或顯式數(shù)據(jù)對齊功能的數(shù)據(jù)結(jié)構(gòu)
2.集成時間序列功能
3.數(shù)學(xué)運算和約簡
4.靈活處理缺失數(shù)據(jù)
5.常見數(shù)據(jù)庫的關(guān)系型運算
引入約定:
In [1]: from pandas import Series, DataFrame
In [2]: import pandas as pd
pandas的數(shù)據(jù)結(jié)構(gòu)介紹
Series和DataFrame
Series
obj=Series([4,7,-5,3])
obj
0? ? 4
1? ? 7
2? ? 5
3? -4
dtype: int64
左邊是索引,右邊是值,分別由obj.index和obj.values獲取
obj2 = Series([4,7,5,-4],index=['d','a','c','b']) #這里我們自定義索引值
可以通過索引的方式選取\添加和改變Series中的單個或一組值,用法跟字典類似
NumPy的數(shù)組運算(如根據(jù)布爾型數(shù)組進(jìn)行過濾\標(biāo)量乘法\應(yīng)用數(shù)學(xué)函數(shù)等)都會保留索引和值之間的鏈接關(guān)系
obj2[obj>0]
obj2 * 2
np.exp(obj2)
可以將Series看成是一個定長的有序字典
'b' in obj2
True
如果數(shù)據(jù)存放在python字典中,也可以直接通過這個字典來創(chuàng)建Series
obj3 = Series(dic) 索引就是鍵
若存在另外一個列表list
obj4 = Series(dic, index=list) 如果list中的「索引」沒有對應(yīng)的值,會顯示NaN
pandas的isnull和notnull函數(shù)可用于檢測缺失數(shù)據(jù)
Series的一個重要功能:它在算術(shù)運算中會自動對齊不同索引的數(shù)據(jù):
注意與NaN的算術(shù)運算總會返回NaN
Series對象及其索引都有一個name屬性,該屬性跟pandas其他關(guān)鍵功能關(guān)系非常密切
obj.name = 'abc'
obj.index,name = 'def'
Series的索引可以通過賦值的方式就地修改(不能多也不能少)
obj.index=list
DataFrame
一個表格型的數(shù)據(jù)結(jié)構(gòu),有行索引和列索引,可以看做是由Series組成的字典(共用同一個索引)
最常用的構(gòu)建DataFrame方法:直接傳入一個由等長列表或NumPy數(shù)組組成的字典
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = DataFrame(data)
frame
? ? ?pop? state? year
0? 1.5? ? Ohio? 2000
1? 1.7? ? Ohio? 2001
2? 3.6? ? Ohio? 2002
3? 2.4? Nevada? 2001
4? 2.9? Nevada? 2002
可以用columns和index指定列索引和行索引,若傳入的列在數(shù)據(jù)中找不到,就會產(chǎn)生NaN值,行不能多或少否則報錯
通過類似字典標(biāo)記的方式,可以獲取將DataFrame的列獲取為一個Series
frame2['year']
注意返回的Series擁有相同索引,且name屬性也已被相應(yīng)設(shè)置好
行可以通過索引字段ix獲取
frame2.ix['two']
列可以通過賦值的方式進(jìn)行修改;
將列表或數(shù)組賦值給某個列時,長度必須與DataFrame長度匹配;
如賦值的是一個Series,就會精確匹配到DataFrame的索引,空位將天上缺失值(注意這個Series需要加索引值)
為不存在的列賦值會創(chuàng)建一個新列;
關(guān)鍵字del用于刪除列
del frame2['year'] 必須是中括號不能是frame2.year
通過索引方式返回的是相應(yīng)數(shù)據(jù)的視圖不是副本,因此對返回Series所做的修改會反映到源DataFrame上;通過Series的copy方法可顯式的復(fù)制列
另一種常見的數(shù)據(jù)形式是嵌套字典
pop={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
frame3 = DataFrame(pop)
外層字典的鍵作為列\(zhòng)內(nèi)層鍵作為索引
內(nèi)層鍵會被合并\排序形成最終的索引,可以指定索引
frame3 = DataFrame(pop, index = [2001, 2002, 2003])
表5-1列出了DataFrame所能接受的各種數(shù)據(jù)
可以給DataFrame的index和columns設(shè)置name屬性,這些信息就會顯示出來
values屬性會以二位ndarray的形式返回DataFrame中的數(shù)據(jù)
索引對象
pandas的索引對象負(fù)責(zé)管理軸標(biāo)簽和其他元數(shù)據(jù)(比如軸名稱)
Index對象不可修改(immutable),這樣才能使Index對象在多個數(shù)據(jù)結(jié)構(gòu)之間安全共享
表5-2 pandas中主要的Index對象
表5-3 Index的方法和屬性
基本功能
介紹操作Series和DataFrame的基本手段
重新索引
reindex\作用是創(chuàng)建一個適應(yīng)新索引的新對象
obj=Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c'])
obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0) 這里如果不填寫就會引入NaN
reindex的(插值)method選項
ffill或pad\前向填充或搬運值
bfill或backfill\向后填充或搬運值
obj3.reindex(range(6),method='ffill')
0? ? ? blue
1? ? ? blue
2? ? purple
3? ? purple
4? ? yellow
5? ? yellow
dtype: object
丟棄指定軸上的項
drop()相應(yīng)的columns或index,注意是多個的話用列表形式
索引\選取和過濾
Series索引的工作方式類似于NumPy,只不過索引值不只是整數(shù)
obj = Series(np.arange(4.), index=['a', 'b', 'c', 'd'])
obj
a 0.0
b 1.0
c 2.0
d 3.0
obj['b']\1.0
obj[1]\1.0
obj[2:4]
c 2
d 3
obj[['b', 'a', 'd']]
b 1
a 0
d 3
obj[obj < 2]
a 0
b 1
利用標(biāo)簽的切片運算與普通的python切片運算不同,其末端是包含(inclusive)的(封閉區(qū)間)
obj['b':'c']
b 1
c 2
引入字段ix對DataFrame的行上進(jìn)行標(biāo)簽索引
data=DataFrame(np.arange(16).reshape((4,4)),index=['Ohio','Colorado','Utah','New York'],columns=['one','two','three','four'])
data.ix['Colorado', ['two', 'three']]
表5-6 DataFrame的索引選項
算術(shù)運算和數(shù)據(jù)對齊
注意對應(yīng)關(guān)系以及和NaN運算結(jié)果始終為NaN
在算術(shù)方法中填充值
靈活的算術(shù)方法
add(+)
sub(-)
div(/)
mul(*)
使用類似方法可以傳入fill_value參數(shù)替代缺失值
DataFrame和Series之間的運算
廣播(第十二章詳解)
函數(shù)應(yīng)用和映射
NumPy的ufuncs(元素級數(shù)組方法)也可以用于pandas對象
另一個常見操作是,將函數(shù)應(yīng)用到由各列或行所形成的一維數(shù)組上\
DataFrame的apply方法即可實現(xiàn)此功能
frame=DataFrame(np.random.randn(4,3),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])
f=lambdax:x.max()-x.min()
frame.apply(f) #默認(rèn)是列索引
frame.apply(f,axis=1) #這個是行索引
def f(x):
? ? return Series([x.min(),x.max()],index=['min','max'])
frame.apply(f)
? ? ? ? ? ? ? b ? ? ? ? ? ? ? ? ? d ? ? ? ? ? ? ? ?e
min -2.216707 -1.101685 -0.717719
max? 2.266630? 1.664559? 1.172415
此外,元素級的python函數(shù)也是可用的,假如你想得到frame中各個浮點值的格式化字符串,使用applymap
format=lambda x:'%.2f' % x
frame.applymap(format)
? ? ? ? ? ? ? ? ? ? b? ? ? d? ? ? e
Utah? ? -2.22? 1.66? -0.72
Ohio? ? 0.30? 1.21? -0.65
Texas? ? 2.27? -1.10? 1.17
Oregon? -0.49? 0.38? -0.33
frame['e'].map(format) #對某一列操作函數(shù)
Utah? ? ? -0.72
Ohio? ? ? -0.65
Texas? ? ? 1.17
Oregon? ? -0.33
Name: e, dtype: object
排序和排名
對于Series,使用sort_index方法,返回一個根據(jù)index排序的新對象
obj.order()按值對Series排序
任何缺失值會被排到末尾
對于DataFrame,可根據(jù)任意軸上的索引進(jìn)行排序,給sort_index()傳入axis=1即可,默認(rèn)為對index排序
默認(rèn)是升序排序,ascending=False為降序排序
sort_index(by='b') 或 sort_index(by=['b', 'c'])
排名rank()
排名時用于破壞平級關(guān)系的method選項
'average'\'min'\'max'\'first'
帶有重復(fù)值的軸索引
若某個索引對應(yīng)多個值返回Series,對應(yīng)單個值返回一個標(biāo)量值
匯總和計算描述統(tǒng)計
axis\約簡的軸,DataFrame中行用0,列用1(默認(rèn)為0)
skipna\排除缺失值,默認(rèn)是True
level\如果軸是層次化索引的(即MultiIndex),則根據(jù)level分組約簡
describe用于一次性產(chǎn)生多個匯總統(tǒng)計
df.describe()
表5-10列出了所有與描述統(tǒng)計相關(guān)的方法
相關(guān)系數(shù)與協(xié)方差
Series的corr方法用于計算兩個Series中重疊的\非NA的\按索引對齊的值的相關(guān)系數(shù)
df.series1.corr(df.series2)
類似的用cov計算協(xié)方差
另外對于一個DataFrame對象的corr和cov方法將返回完整的相關(guān)系數(shù)或協(xié)方差矩陣
利用DataFrame的corrwith方法,可以計算其列或行跟另一個Series或DataFrame之間的相關(guān)系數(shù);
傳入一個Series將會返回一個相關(guān)系數(shù)值Series(針對各列進(jìn)行計算)
傳入一個DataFrame則會計算按列名配對的相關(guān)系數(shù)
唯一值\值計數(shù)以及成員資格
isin\計算一個表示'Series各值是否包含于傳入的值的序列中'的布爾型數(shù)組
unique\計算Series中的唯一值數(shù)組,按發(fā)現(xiàn)的順序返回
value_counts\返回一個Series,其索引為唯一值,其值為頻率,按技術(shù)支持降序排列
data=DataFrame({'Qu1':[1,3,4,3,4],'Qu2':[2,3,1,2,3],'Qu3':[1,5,2,4,4]})
data
? Qu1? Qu2? Qu3
0? ? 1? ? 2? ? 1
1? ? 3? ? 3? ? 5
2? ? 4? ? 1? ? 2
3? ? 3? ? 2? ? 4
4? ? 4? ? 3? ? 4
將pd.value_counts傳給該DataFrame的apply函數(shù)
result = data.apply(pd.value_counts).fillna(0)
result
?Qu1? Qu2? Qu3
1? 1.0? 1.0? 1.0
2? 0.0? 2.0? 1.0
3? 2.0? 2.0? 0.0
4? 2.0? 0.0? 2.0
5? 0.0? 0.0? 1.0
處理缺失數(shù)據(jù)
pandas使用浮點值NaN表示浮點和非浮點數(shù)組中的缺失數(shù)據(jù);
python內(nèi)置的None值也會當(dāng)做NA處理
dropna\根據(jù)各標(biāo)簽的值中是否存在缺失數(shù)據(jù)對軸標(biāo)簽進(jìn)行過濾,可通過閾值調(diào)節(jié)對缺失值的容忍度
fillna\用指定值或插值方法填充缺失數(shù)據(jù)
濾除缺失數(shù)據(jù)
對于Series,dropna返回僅含非空數(shù)據(jù)和索引值的Series;也可以用notnull()布爾索引值方法達(dá)到相同結(jié)果
對于DataFrame,默認(rèn)丟棄任何含有缺失值的行;
傳入how='all',將只丟棄全為NA的行;
傳入axis=1,將丟棄列
填充缺失數(shù)據(jù)
fillna()
傳入常數(shù)\傳入字典\也可以傳入data.mean()平均數(shù),中文數(shù)之類的
fillna默認(rèn)返回新對象,傳入inplace=True會覆蓋源對象
層次化索引
它能使你在一個軸上擁有多個索引級別\能以低緯度形式處理高維度數(shù)據(jù)
重排分級順序
swaplevel接受兩個級別編號或名稱,并返回一個互換級別的新對象(但數(shù)據(jù)不會發(fā)生變化)
根據(jù)級別匯總統(tǒng)計
level選項用于指定某條軸上求和的級別(利用了groupby功能)
使用DataFrame的列
將DataFrame的一個或多個列當(dāng)做行索引來用,或者可能將行索引變成DataFrame的列.
set_index()\將列轉(zhuǎn)換為行索引(傳入columns的標(biāo)簽),默認(rèn)會移除這些列,傳入drop=False將其保留
reset_index剛好相反
其他有關(guān)pandas的話題
整數(shù)索引
面板數(shù)據(jù)
Panel數(shù)據(jù)結(jié)構(gòu),三維版的DataFrame