在進(jìn)行數(shù)據(jù)分析的過(guò)程中,經(jīng)常會(huì)需要某一列與某一列進(jìn)行計(jì)算,甚至某一個(gè)數(shù)據(jù)塊與另外的數(shù)據(jù)塊進(jìn)行計(jì)算。如果相應(yīng)的數(shù)據(jù)結(jié)構(gòu)的形狀相同還好,多數(shù)分析軟件都能應(yīng)對(duì)。若數(shù)據(jù)結(jié)構(gòu)的形狀有一定的差異,應(yīng)該如何處理,如何對(duì)齊,如何運(yùn)算呢?
在對(duì)齊這個(gè)方面,Python的數(shù)據(jù)分析庫(kù),pandas做的就非常好,我們可以通過(guò)對(duì)pandas的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)——Series的簡(jiǎn)單分析來(lái)窺探一二。
我們可以先從Series的創(chuàng)建入手。Series的創(chuàng)建,遵從index優(yōu)先的法則。我們知道,在創(chuàng)建Series時(shí),可以使用字典直接將索引和數(shù)值一次性交代清楚,比如下面:
在創(chuàng)建過(guò)程中,字典的鍵則轉(zhuǎn)化為Series的索引,字典的值轉(zhuǎn)化為Series的值。這個(gè)沒(méi)什么疑問(wèn)。然而有個(gè)問(wèn)題是,字典是無(wú)序的鍵值對(duì),但Series卻是有序的,因此出現(xiàn)了像上圖的情況:你的Series最終呈現(xiàn)出來(lái)的順序,并不是你心里想要的,因?yàn)樽值錈o(wú)序。
在這種情況下,我們就需要在創(chuàng)建Series的時(shí)候傳入index參數(shù),告訴pandas,告訴Python,你想要的順序是怎樣的。
如上圖,當(dāng)你傳入了一個(gè)有序的列表,Python就知道你是要指定這樣一個(gè)順序,并且會(huì)自動(dòng)將列表和字典進(jìn)行對(duì)比,A對(duì)應(yīng)A的值,B對(duì)應(yīng)B的值,順序正確的情況下,一一對(duì)應(yīng)關(guān)系也不會(huì)錯(cuò)亂。
如果我的index多傳了或者少傳了元素會(huì)怎么辦?
記住上面的話,index優(yōu)先。即字典的鍵的數(shù)量和index的元素個(gè)數(shù)不匹配的時(shí)候,以index為準(zhǔn),多退少補(bǔ)。補(bǔ)的話自然是用NaN來(lái)補(bǔ)充了。
無(wú)論是多了還是少了,總之索引與值的對(duì)應(yīng)關(guān)系不會(huì)亂,這是pandas的強(qiáng)大之處。
同樣的,我們?cè)诓僮鲀蓚€(gè)Series進(jìn)行加減乘除之類(lèi)的運(yùn)算時(shí),也會(huì)先進(jìn)行索引的對(duì)齊,然后再進(jìn)行運(yùn)算。
我們重新構(gòu)造一個(gè)Series:
然后將該Series顛倒一下順序賦值給另一個(gè)變量s2,這樣就相當(dāng)于構(gòu)造出另一個(gè)新的Series了。
想一想,如果我現(xiàn)在用s+s2,會(huì)出現(xiàn)怎樣的結(jié)果?會(huì)直接第一行與第一行的數(shù)相加,第二行與第二行相加,以此類(lèi)推嗎?
如果是這樣的話,那么pandas就是一廢物了。
可以看出,在相加之前,pandas會(huì)先對(duì)數(shù)據(jù)做對(duì)齊工作,而這個(gè)對(duì)齊,并不是基于空間上的位置,而是基于索引(index)的,相同的索引上的數(shù)據(jù)才會(huì)進(jìn)行相加。因此你的空間順序無(wú)論如何打亂,只要索引與值的對(duì)應(yīng)關(guān)系沒(méi)變,都不要緊。
這就是pandas的強(qiáng)大之處,也是pandas能從眾多Python第三方數(shù)據(jù)分析工具里脫穎而出的原因之一。
聯(lián)系客服