pandas入門

功能包括但不限于:

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

可以用columnsindex指定列索引和行索引,若傳入的列在數(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俄占,一起剝皮案震驚了整個濱河市啃奴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌医寿,老刑警劉巖赵讯,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盈咳,死亡現(xiàn)場離奇詭異,居然都是意外死亡边翼,警方通過查閱死者的電腦和手機(jī)鱼响,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來组底,“玉大人丈积,你說我怎么就攤上這事≌Γ” “怎么了江滨?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長厌均。 經(jīng)常有香客問我唬滑,道長,這世上最難降的妖魔是什么棺弊? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任晶密,我火速辦了婚禮,結(jié)果婚禮上模她,老公的妹妹穿的比我還像新娘稻艰。我一直安慰自己,他們只是感情好缝驳,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布连锯。 她就那樣靜靜地躺著归苍,像睡著了一般用狱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拼弃,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天夏伊,我揣著相機(jī)與錄音,去河邊找鬼吻氧。 笑死溺忧,一個胖子當(dāng)著我的面吹牛咏连,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鲁森,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼祟滴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了歌溉?” 一聲冷哼從身側(cè)響起垄懂,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痛垛,沒想到半個月后草慧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡匙头,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年漫谷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹂析。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡舔示,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出电抚,到底是詐尸還是另有隱情斩郎,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布喻频,位于F島的核電站缩宜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏甥温。R本人自食惡果不足惜锻煌,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姻蚓。 院中可真熱鬧宋梧,春花似錦、人聲如沸狰挡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽加叁。三九已至倦沧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間它匕,已是汗流浹背展融。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留豫柬,地道東北人告希。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓扑浸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親燕偶。 傳聞我的和親對象是個殘疾皇子喝噪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容