Python—Pandas的基本使用(機(jī)器學(xué)習(xí)基礎(chǔ))

一.pandas基礎(chǔ)

1.pandas 是基于NumPy 的一種工具剂桥,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的容达。Pandas 納入了大量庫(kù)和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型评疗,提供了高效地操作大型數(shù)據(jù)集所需的工具拾徙。pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法即供。你很快就會(huì)發(fā)現(xiàn)吨悍,它是使Python成為強(qiáng)大而高效的數(shù)據(jù)分析環(huán)境的重要因素之一扫茅。(百度百科)
2.pandas 是基于 Numpy 構(gòu)建的含有更高級(jí)數(shù)據(jù)結(jié)構(gòu)和工具的數(shù)據(jù)分析包,現(xiàn)已經(jīng)取代R稱(chēng)為數(shù)據(jù)分析的主要工具育瓜。
3.類(lèi)似于 Numpy 的核心是 ndarray葫隙,pandas 也是圍繞著 Series 和 DataFrame(R的數(shù)據(jù)結(jié)構(gòu)) 兩個(gè)核心數(shù)據(jù)結(jié)構(gòu)展開(kāi)的 。
4.Series 和 DataFrame 分別對(duì)應(yīng)于一維的序列和二維的表結(jié)構(gòu)躏仇。
5.pandas 約定俗成的導(dǎo)入方法如下:

  • from pandas import Series,DataFrame
  • import pandas as pd

二.Series

Series 可以看做一個(gè)定長(zhǎng)的有序字典恋脚。基本任意的一維數(shù)據(jù)都可以用來(lái)構(gòu)造 Series 對(duì)象:


示例1

雖然 dtype:object 可以包含多種基本數(shù)據(jù)類(lèi)型焰手,但總感覺(jué)會(huì)影響性能的樣子糟描,最好還是保持單純的 dtype书妻。
Series 對(duì)象包含兩個(gè)主要的屬性:index 和 values船响,分別為上例中左右兩列。因?yàn)閭鹘o構(gòu)造器的是一個(gè)列表躲履,所以 index 的值是從 0 起遞增的整數(shù)见间,如果傳入的是一個(gè)類(lèi)字典的鍵值對(duì)結(jié)構(gòu),就會(huì)生成 index-value 對(duì)應(yīng)的 Series工猜;或者在初始化的時(shí)候以關(guān)鍵字參數(shù)顯式指定一個(gè) index 對(duì)象:


示例2

Series 對(duì)象的元素會(huì)嚴(yán)格依照給出的 index 構(gòu)建米诉,這意味著:如果 data 參數(shù)是有鍵值對(duì)的,那么只有 index 中含有的鍵會(huì)被使用域慷;以及如果 data 中缺少響應(yīng)的鍵,即使給出 NaN 值犹褒,這個(gè)鍵也會(huì)被添加抵窒。
  • PS:
    Series 的 index 和 values 的元素之間雖然存在對(duì)應(yīng)關(guān)系,但這與字典的映射不同叠骑。index 和 values 實(shí)際仍為互相獨(dú)立的 ndarray 數(shù)組李皇,因此 Series 對(duì)象的性能完全 ok。

Series 這種使用鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)最大的好處在于宙枷,Series 間進(jìn)行算術(shù)運(yùn)算時(shí)掉房,index 會(huì)自動(dòng)對(duì)齊。
另外慰丛,Series 對(duì)象和它的 index 都含有一個(gè) name 屬性:


示例3

三.DataFrame

DataFrame 是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu)卓囚,它含有一組有序的列(類(lèi)似于 index),每列可以是不同的值類(lèi)型(不像 ndarray 只能有一個(gè) dtype)诅病∧囊冢基本上可以把 DataFrame 看成是共享同一個(gè) index 的 Series 的集合粥烁。
DataFrame 的構(gòu)造方法與 Series 類(lèi)似,只不過(guò)可以同時(shí)接受多條一維數(shù)據(jù)源蝇棉,每一條都會(huì)成為單獨(dú)的一列:


示例4

雖然參數(shù) data 看起來(lái)是個(gè)字典讨阻,但字典的鍵并非充當(dāng) DataFrame 的 index 的角色,而是 Series 的 “name” 屬性篡殷。這里生成的 index 仍是 “01234”。
較完整的 DataFrame 構(gòu)造器參數(shù)為:DataFrame(data=None,index=None,coloumns=None)奇瘦,columns 即 “name”:


示例5

同樣缺失值由 NaN 補(bǔ)上÷槟恚看一下 index贸毕、columns 和 索引的類(lèi)型:
示例6

DataFrame 面向行和面向列的操作基本是平衡的,任意抽出一列都是 Series摊腋。

四.對(duì)象屬性

1.重新索引

Series 對(duì)象的重新索引通過(guò)其 .reindex(index=None,kwargs) 方法實(shí)現(xiàn)兴蒸。kwargs 中常用的參數(shù)有倆:method=None,fill_value=np.NaN:

示例1

.reindex() 方法會(huì)返回一個(gè)新對(duì)象橙凳,其 index 嚴(yán)格遵循給出的參數(shù)岛啸,method:{'backfill', 'bfill', 'pad', 'ffill', None} 參數(shù)用于指定插值(填充)方式茴肥,當(dāng)沒(méi)有給出時(shí)瓤狐,自動(dòng)用 fill_value 填充,默認(rèn)為 NaN(ffill = pad赴捞,bfill = back fill赦政,分別指插值時(shí)向前還是向后取值)
DataFrame 對(duì)象的重新索引方法為:.reindex(index=None,columns=None,kwargs)。僅比 Series 多了一個(gè)可選的 columns 參數(shù)掰派,用于給列索引。用法與上例類(lèi)似略步,只不過(guò)插值方法 method 參數(shù)只能應(yīng)用于行趟薄,即軸 0典徊。
示例2

不過(guò) fill_value 依然對(duì)有效羡铲。聰明的小伙伴可能已經(jīng)想到了犀勒,可不可以通過(guò) df.T.reindex(index,method='
').T 這樣的方式來(lái)實(shí)現(xiàn)在列上的插值呢妥曲,答案是可行的。另外要注意檐盟,使用 reindex(index,method='**') 的時(shí)候,index 必須是單調(diào)的葵萎,否則就會(huì)引發(fā)一個(gè) ValueError: Must be monotonic for forward fill唱凯,比如上例中的最后一次調(diào)用,如果使用 index=['a','b','d','c'] 的話(huà)就不行谎痢。

2.刪除指定軸上的項(xiàng)

即刪除 Series 的元素或 DataFrame 的某一行(列)的意思磕昼,通過(guò)對(duì)象的 .drop(labels, axis=0) 方法:


示例3

.drop() 返回的是一個(gè)新對(duì)象节猿,元對(duì)象不會(huì)被改變滨嘱。

3.索引和切片

就像 Numpy吟榴,pandas 也支持通過(guò) obj[::] 的方式進(jìn)行索引和切片,以及通過(guò)布爾型數(shù)組進(jìn)行過(guò)濾。
不過(guò)須要注意仿野,因?yàn)?pandas 對(duì)象的 index 不限于整數(shù),所以當(dāng)使用非整數(shù)作為切片索引時(shí)她君,它是末端包含的脚作。


示例4

這里 ser 和 df只有 index 不同——ser 的 index 是整數(shù)序列〉奚玻可見(jiàn)當(dāng)使用整數(shù)索引切片時(shí)球涛,結(jié)果與 Python 列表或 Numpy 的默認(rèn)狀況相同;換成 'a' 這樣的字符串索引時(shí)校镐,結(jié)果就包含了這個(gè)邊界元素亿扁。
另外一個(gè)特別之處在于 DataFrame 對(duì)象的索引方式,因?yàn)樗袃蓚€(gè)軸向(雙重索引)鸟廓。
可以這么理解:DataFrame 對(duì)象的標(biāo)準(zhǔn)切片語(yǔ)法為:.ix[::,::]从祝。ix 對(duì)象可以接受兩套切片,分別為行(axis=0)和列(axis=1)的方向:


示例6

而不使用 ix 引谜,直接切的情況就特殊了:
  • 索引時(shí)牍陌,選取的是列
  • 切片時(shí),選取的是行
    這看起來(lái)有點(diǎn)不合邏輯员咽,但作者解釋說(shuō) “這種語(yǔ)法設(shè)定來(lái)源于實(shí)踐”毒涧,我們信他。


    示例7

    使用布爾型數(shù)組的情況贝室,注意行與列的不同切法(列切法的 : 不能势踅病):


    示例8
4.算術(shù)運(yùn)算和數(shù)據(jù)對(duì)齊

pandas 最重要的一個(gè)功能是仿吞,它可以對(duì)不同索引的對(duì)象進(jìn)行算術(shù)運(yùn)算。在將對(duì)象相加時(shí)捡偏,結(jié)果的索引取索引對(duì)的并集唤冈。自動(dòng)的數(shù)據(jù)對(duì)齊在不重疊的索引處引入空值,默認(rèn)為 NaN银伟。


示例1

DataFrame 的對(duì)齊操作會(huì)同時(shí)發(fā)生在行和列上务傲。
當(dāng)不希望在運(yùn)算結(jié)果中出現(xiàn) NA 值時(shí),可以使用前面 reindex 中提到過(guò) fill_value 參數(shù)枣申,不過(guò)為了傳遞這個(gè)參數(shù),就需要使用對(duì)象的方法看杭,而不是操作符:df1.add(df2,fill_value=0)忠藤。其他算術(shù)方法還有:sub(), div(), mul()。
Series 和 DataFrame 之間的算術(shù)運(yùn)算涉及廣播楼雹,暫時(shí)先不講模孩。

5.函數(shù)應(yīng)用和映射

Numpy 的 ufuncs(元素級(jí)數(shù)組方法)也可用于操作 pandas 對(duì)象。
當(dāng)希望將函數(shù)應(yīng)用到 DataFrame 對(duì)象的某一行或列時(shí)贮缅,可以使用 .apply(func, axis=0, args=(), **kwds) 方法榨咐。


示例2
6.排序和排名

Series 的 sort_index(ascending=True) 方法可以對(duì) index 進(jìn)行排序操作,ascending 參數(shù)用于控制升序或降序谴供,默認(rèn)為升序块茁。
若要按值對(duì) Series 進(jìn)行排序,當(dāng)使用 .order() 方法桂肌,任何缺失值默認(rèn)都會(huì)被放到 Series 的末尾数焊。
在 DataFrame 上,.sort_index(axis=0, by=None, ascending=True) 方法多了一個(gè)軸向的選擇參數(shù)與一個(gè) by 參數(shù)崎场,by 參數(shù)的作用是針對(duì)某一(些)列進(jìn)行排序(不能對(duì)行使用 by 參數(shù)):


示例3.0
示例3.1
示例3.2

排名(Series.rank(method='average', ascending=True))的作用與排序的不同之處在于佩耳,他會(huì)把對(duì)象的 values 替換成名次(從 1 到 n)。這時(shí)唯一的問(wèn)題在于如何處理平級(jí)項(xiàng)谭跨,方法里的 method 參數(shù)就是起這個(gè)作用的干厚,他有四個(gè)值可選:average, min, max, first。


示例4

注意在 ser[0]=ser[3] 這對(duì)平級(jí)項(xiàng)上螃宙,不同 method 參數(shù)表現(xiàn)出的不同名次蛮瞄。
DataFrame 的 .rank(axis=0, method='average', ascending=True) 方法多了個(gè) axis 參數(shù),可選擇按行或列分別進(jìn)行排名谆扎,暫時(shí)好像沒(méi)有針對(duì)全部元素的排名方法裕坊。

7.統(tǒng)計(jì)方法

pandas 對(duì)象有一些統(tǒng)計(jì)方法。它們大部分都屬于約簡(jiǎn)和匯總統(tǒng)計(jì)燕酷,用于從 Series 中提取單個(gè)值籍凝,或從 DataFrame 的行或列中提取一個(gè) Series周瞎。
比如 DataFrame.mean(axis=0,skipna=True) 方法,當(dāng)數(shù)據(jù)集中存在 NA 值時(shí)饵蒂,這些值會(huì)被簡(jiǎn)單跳過(guò)声诸,除非整個(gè)切片(行或列)全是 NA,如果不想這樣退盯,則可以通過(guò) skipna=False 來(lái)禁用此功能:


示例5

其他常用的統(tǒng)計(jì)方法有:


其他方法

五.處理缺失數(shù)據(jù)

pandas 中 NA 的主要表現(xiàn)為 np.nan彼乌,另外 Python 內(nèi)建的 None 也會(huì)被當(dāng)做 NA 處理。
處理 NA 的方法有四種:dropna , fillna , isnull , notnull 渊迁。

1.is(not)null

這一對(duì)方法對(duì)對(duì)象做元素級(jí)應(yīng)用慰照,然后返回一個(gè)布爾型數(shù)組,一般可用于布爾型索引琉朽。

2.dropna

對(duì)于一個(gè) Series毒租,dropna 返回一個(gè)僅含非空數(shù)據(jù)和索引值的 Series。
問(wèn)題在于對(duì) DataFrame 的處理方式箱叁,因?yàn)橐坏?drop 的話(huà)墅垮,至少要丟掉一行(列)。這里的解決方式與前面類(lèi)似耕漱,還是通過(guò)一個(gè)額外的參數(shù):dropna(axis=0, how='any', thresh=None) 算色,how 參數(shù)可選的值為 any 或者 all。all 僅在切片元素全為 NA 時(shí)才拋棄該行(列)螟够。另外一個(gè)有趣的參數(shù)是 thresh灾梦,該參數(shù)的類(lèi)型為整數(shù),它的作用是妓笙,比如 thresh=3斥废,會(huì)在一行中至少有 3 個(gè)非 NA 值時(shí)將其保留。

3.fillna

fillna(value=None, method=None, axis=0) 中的 value 參數(shù)除了基本類(lèi)型外给郊,還可以使用字典牡肉,這樣可以實(shí)現(xiàn)對(duì)不同的列填充不同的值。method 的用法與前面 .reindex() 方法相同淆九,這里不再贅述统锤。

4.inplace 參數(shù)

Series 和 DataFrame 對(duì)象的方法中,凡是會(huì)對(duì)數(shù)組作出修改并返回一個(gè)新數(shù)組的炭庙,往往都有一個(gè) replace=False 的可選參數(shù)饲窿。如果手動(dòng)設(shè)定為 True,那么原數(shù)組就可以被替換焕蹄。

(此文章僅作為個(gè)人學(xué)習(xí)筆記使用逾雄,如有錯(cuò)誤歡迎指正~)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸦泳,更是在濱河造成了極大的恐慌银锻,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件做鹰,死亡現(xiàn)場(chǎng)離奇詭異击纬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钾麸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)更振,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人饭尝,你說(shuō)我怎么就攤上這事肯腕。” “怎么了钥平?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵实撒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我帖池,道長(zhǎng),這世上最難降的妖魔是什么吭净? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任睡汹,我火速辦了婚禮,結(jié)果婚禮上寂殉,老公的妹妹穿的比我還像新娘囚巴。我一直安慰自己,他們只是感情好友扰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布彤叉。 她就那樣靜靜地躺著,像睡著了一般村怪。 火紅的嫁衣襯著肌膚如雪秽浇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天甚负,我揣著相機(jī)與錄音柬焕,去河邊找鬼。 笑死梭域,一個(gè)胖子當(dāng)著我的面吹牛斑举,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播病涨,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼富玷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起赎懦,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤雀鹃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后铲敛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體褐澎,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年伐蒋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了工三。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡先鱼,死狀恐怖俭正,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情焙畔,我是刑警寧澤掸读,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站宏多,受9級(jí)特大地震影響儿惫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伸但,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一肾请、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧更胖,春花似錦铛铁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至彪标,卻和暖如春倍权,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捞烟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工账锹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坷襟。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓奸柬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親婴程。 傳聞我的和親對(duì)象是個(gè)殘疾皇子廓奕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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