導(dǎo)讀:本文主要介紹使用Python進(jìn)行數(shù)據(jù)分析時(shí)必備的編程基礎(chǔ)知識(shí),主要涉及Python的基本數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)、程序控制、讀寫數(shù)據(jù)等內(nèi)容。 Python編寫代碼時(shí),是以縮進(jìn)作為代碼塊的標(biāo)識(shí),而不是使用花括號(hào)等字符,這與其它語(yǔ)言有較大差別。這種方式顯示的代碼可讀性更高,通常使用四個(gè)空格或一個(gè)tab作縮進(jìn),如果是Python編程的新手,要注意這一點(diǎn)。 作者:常國(guó)珍、趙仁乾、張秋劍 本文摘編自《Python數(shù)據(jù)科學(xué):技術(shù)詳解與商業(yè)實(shí)踐》,如需轉(zhuǎn)載請(qǐng)聯(lián)系大數(shù)據(jù)(ID:hzdashuju) 01 Python的基本數(shù)據(jù)類型 Python的基本數(shù)據(jù)類型包括幾種,如下表:
▲表3-1 Python基礎(chǔ)數(shù)據(jù)類型 下面一一進(jìn)行詳述。 1. 字符串(str) Python中,單引號(hào)、雙引號(hào)、三引號(hào)包圍的都是字符串,如下所示: 'spam eggs' 此外,Python中的字符串也支持一些格式化輸出,例如換行符“\n”和制表符“\t”: print('First line.\nSecond line.') 當(dāng)然,有時(shí)候?yàn)楸苊饣煜?,也?huì)使用轉(zhuǎn)義字符“\”,用于轉(zhuǎn)義“\”后一位的字符為原始輸出。 '\'Yes,\' he said.' 此外還可以通過(guò)在引號(hào)前加r來(lái)表示原始輸出: print('C:\some\name') #有換行符的輸出 Python中字符串支持加運(yùn)算表示字符串拼接: 'pyt'+'hon' 2. 浮點(diǎn)數(shù)和整數(shù)(float,int) Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù),在程序中的表示方法和數(shù)學(xué)上的寫法一模一樣。 1+1 Python支持?jǐn)?shù)值的四則運(yùn)算,如下所示: 1+1 #加法 Python可以處理雙精度浮點(diǎn)數(shù),可以滿足絕大部分?jǐn)?shù)據(jù)分析的需求,要精確空值數(shù)字精度,還可以使用numpy擴(kuò)展庫(kù)。 此外,可以使用內(nèi)置函數(shù)進(jìn)行數(shù)值類型轉(zhuǎn)換,例如轉(zhuǎn)換數(shù)值字符為數(shù)值: float('1') 3. 布爾值 (Bool:True/False) Python布爾值一般通過(guò)邏輯判斷產(chǎn)生,只有兩個(gè)可能結(jié)果:True/False 整型、浮點(diǎn)型的“0”和復(fù)數(shù)0+0j也可以表示False,其余整型、浮點(diǎn)型、復(fù)數(shù)數(shù)值都被判斷為True,如下代碼通過(guò)邏輯表達(dá)式創(chuàng)建bool邏輯值: 1 == 1 當(dāng)然,Python中提供了邏輯值的運(yùn)算即“且”、“或”、“非”運(yùn)算, True and False #且 布爾邏輯值轉(zhuǎn)換可以使用內(nèi)置函數(shù)bool,除數(shù)字0外,其他類型用bool轉(zhuǎn)換結(jié)果都為True。 bool(1) Python中對(duì)象類型轉(zhuǎn)換可參考表3-2。
▲表3-2 Python數(shù)據(jù)類型轉(zhuǎn)換 4. 其他 Python中,還有一些特殊的數(shù)據(jù)類型,例如無(wú)窮值,nan(非數(shù)值),None等。可以通過(guò)以下方式創(chuàng)建: float('-inf') #負(fù)無(wú)窮 下面是無(wú)窮值的一些運(yùn)算,注意正負(fù)無(wú)窮相加返回nan(not a number),表示非數(shù)值 float('-inf')+1 非數(shù)值nan在Python中與任何數(shù)值的運(yùn)算結(jié)果都會(huì)產(chǎn)生nan,nan甚至不等于自身。如下所示。nan可用于表示缺失值。 float('nan') == float('nan') 此外,python中提供了None來(lái)表示空,其僅僅支持判斷運(yùn)算,如下所示 x = None 02 Python的基本數(shù)據(jù)結(jié)構(gòu) Python的基本數(shù)據(jù)類型包括以下幾種,這些數(shù)據(jù)類型表示了自身在Python中的存儲(chǔ)形式。在Python中可以輸入type(對(duì)象)查看數(shù)據(jù)類型。 1. 列表(list) 1.1 列表簡(jiǎn)介 列表list是Python內(nèi)置的一種數(shù)據(jù)類型,是一種有序的集合,用來(lái)存儲(chǔ)一連串元素的容器,列表用[]來(lái)表示,其中元素的數(shù)據(jù)類型可不相同。 list1 = [1,'2',3,4] 除了使用“[]”創(chuàng)建列表外,還可以使用list()函數(shù): list([1,2,3]) 可以通過(guò)索引對(duì)訪問(wèn)或修改列表相應(yīng)位置的元素,使用索引時(shí),通過(guò)”[]”來(lái)指定位置。在Python中,索引的起始位置為0,例如取list1的第一個(gè)位置的元素: list1[0] 可以通過(guò)”:”符號(hào)選取指定序列的位置的元素,例如取第1到第3個(gè)位置的元素,注意這種索引取數(shù)是前包后不包的(包括0位置,但不包括3位置,即取0,1,2位置的元素): list1[0:3] 此外,Python中的負(fù)索引表示倒序位置,例如-1代表list1最后一個(gè)位置的元素: list1[-1] 列表支持加法運(yùn)算,表示兩個(gè)或多個(gè)列表合并為一個(gè)列表,如下所示: [1,2,3]+[4,5,6] 1.2 列表的方法 Python中,列表對(duì)象內(nèi)置了一些方法。這里介紹append方法和extend方法,append方法表示在現(xiàn)有列表中添加一個(gè)元素,在循環(huán)控制語(yǔ)句中,append方法使用較多,以下是示例: list2 = [1,2] extend方法類似于列表加法運(yùn)算,表示合并兩個(gè)列表為一個(gè)列表: list2 = [1,2] 2. 元組(tuple) 元組與列表類似,區(qū)別在于在列表中,任意元素可以通過(guò)索引進(jìn)行修改。而元組中,元素不可更改,只能讀取。下面展示了元組和列表的區(qū)別,列表可以進(jìn)行賦值,而同樣的操作應(yīng)用于元組則報(bào)錯(cuò)。 list0 = [1,2,3] 這里通過(guò)”()”創(chuàng)建元組,python中,元組類對(duì)象一旦定義雖然無(wú)法修改,但支持加運(yùn)算,即合并元組。 (1,2,3)+(4,5,6) 元組也支持像列表那樣通過(guò)索引方式進(jìn)行訪問(wèn)。 t1 = (1,2,3) 3. 集合(set) Python中,集合(set)是一組key的集合,其中key不能重復(fù)??梢酝ㄟ^(guò)列表、字典或字符串等創(chuàng)建集合,或通過(guò)“{}”符號(hào)進(jìn)行創(chuàng)建。Python中集合主要有兩個(gè)功能,一個(gè)功能是進(jìn)行集合操作,另一個(gè)功能是消除重復(fù)元素。 basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'} Python支持?jǐn)?shù)學(xué)意義上的集合運(yùn)算,比如差集、交集、補(bǔ)集、并集等,例如如下集合: A = {1,2,3} A,B的差集,即集合A的元素去除AB共有的元素: A – B A,B的并集,即集合A與集合B的全部唯一元素: A | B A,B的交集,即集合A和集合B共有的元素: A & B A,B的對(duì)稱差,即集合A與集合B的全部唯一元素去除集合A與集合B的公共元素: A ^ B 需要注意集合不支持通過(guò)索引訪問(wèn)指定元素。 4. 字典(dict) Python內(nèi)置了字典dict,在其他語(yǔ)言中也稱為map,使用鍵-值(key-value)存儲(chǔ),具有極快的查找速度,其格式是用大括號(hào){}括起來(lái)key和value用冒號(hào)“:”進(jìn)行對(duì)應(yīng)。例如以下代碼創(chuàng)建了一個(gè)字典: dict1 = {'Nick':28,'Lily':28,'Mark':24} 字典本身是無(wú)序的,可以通過(guò)方法keys和values取字典鍵值對(duì)中的鍵和值,如下所示: dict1.keys() 字典支持按照鍵訪問(wèn)相應(yīng)值的形式,如下所示: dict1['Lily'] 這里需要注意定義字典時(shí),鍵不能重復(fù),否則重復(fù)的鍵值會(huì)替代原先的鍵值,如下所示,鍵’Lily’產(chǎn)生重復(fù),其值被替換。 dict3 = {'Nick':28,'Lily':28,'Mark':24,'Lily':33} 03 Python的程序控制 程序控制結(jié)構(gòu)是編程語(yǔ)言的核心基礎(chǔ),Python的編程結(jié)構(gòu)有3種,本節(jié)將詳細(xì)地介紹這3種結(jié)構(gòu)。 1. 三種基本的編程結(jié)構(gòu)簡(jiǎn)介 簡(jiǎn)單來(lái)說(shuō),程序結(jié)構(gòu)分為三種:順承結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)(圖3-1)。 ▲圖3-1程序執(zhí)行結(jié)構(gòu)
這些結(jié)構(gòu)中,分支結(jié)構(gòu)往往需要條件判斷語(yǔ)句進(jìn)行控制,比如if、else等,而循環(huán)結(jié)構(gòu)則需要循環(huán)語(yǔ)句for進(jìn)行控制,當(dāng)然分支結(jié)構(gòu)與循環(huán)結(jié)構(gòu)完全可以混合,這時(shí)就可以通過(guò)條件循環(huán)語(yǔ)句while進(jìn)行控制。 下面我們具體看看這幾個(gè)結(jié)構(gòu)的程序。 2. 順承結(jié)構(gòu) 2.1 順承結(jié)構(gòu) 現(xiàn)在創(chuàng)建一個(gè)列表a: a = [1,2,3,4,5] 需要打印列表a中的所有元素,可以有如下寫法,雖然煩瑣但完成了任務(wù)。這種順序執(zhí)行的編程結(jié)構(gòu)就是順承結(jié)構(gòu): print(a[0]) 2.2 邏輯行與物理行 Python中,代碼是逐行提交給解釋器進(jìn)行編譯的,這里的一行稱為邏輯行,實(shí)際代碼也確實(shí)是一行,那么代碼的物理行就只有一行,例如上述print代碼,邏輯行和物理行是統(tǒng)一的。 但某些情況下,編寫者寫入一個(gè)邏輯行的代碼過(guò)長(zhǎng)時(shí),可以分拆為多個(gè)物理行執(zhí)行,例如: tuple(set(list([1,2,3,4,5,6,7,8]))) 可以寫為如下方式,符號(hào)’\’是換行的標(biāo)識(shí),此時(shí)代碼還是一個(gè)邏輯行,但有兩個(gè)物理行。 tuple(set(list([1,2,3,\ 當(dāng)多個(gè)邏輯行代碼過(guò)短時(shí): x = 1 可以使用分號(hào)“;”將多個(gè)邏輯行轉(zhuǎn)化為一個(gè)物理行執(zhí)行: x = 1;y = 2;z = 3;print(x,y,z) 3. 分支結(jié)構(gòu) 分支結(jié)構(gòu)的分支用于進(jìn)行條件判斷,Python中,使用if 、elif、else、冒號(hào)與縮進(jìn)表達(dá)。詳細(xì)語(yǔ)法可見以下示例,下面的語(yǔ)法的判斷邏輯為 :
以x=-2測(cè)試結(jié)果: x = -2 這里,if,elif,else組成的邏輯是一個(gè)完整的邏輯,即程序執(zhí)行的時(shí),任何條件成立時(shí),會(huì)停止后面的條件判斷。這里需注意,當(dāng)多個(gè)if存在時(shí)的條件判斷的結(jié)果:若把上述代碼中的elif改為if后,程序執(zhí)行的結(jié)果會(huì)發(fā)生變化,如下所示: x = -2 此時(shí),上述程序的中任何if判斷結(jié)果無(wú)論是否成立都會(huì)依次執(zhí)行一遍,所以x=-2會(huì)被賦值為0后繼續(xù)執(zhí)行,第二個(gè)if判斷為真,第三個(gè)if判斷為假時(shí),再跳到else進(jìn)行執(zhí)行,此時(shí)第三個(gè)if和else才是一個(gè)完整的邏輯。在寫條件判斷結(jié)構(gòu)的程序時(shí)需要注意。 4. 循環(huán)結(jié)構(gòu) 這里介紹Python中的for循環(huán)結(jié)構(gòu)和while循環(huán)結(jié)構(gòu),循環(huán)語(yǔ)句用于遍歷枚舉一個(gè)可迭代對(duì)象的所有取值或其元素,每一個(gè)被遍歷到的取值或元素執(zhí)行指定的程序并輸出。這里可迭代對(duì)象指可以被遍歷的對(duì)象,比如列表、元組、字典等。 4.1 For循環(huán) 下面是一個(gè)for循環(huán)的例子, i用于指代一個(gè)可迭代對(duì)象中a中的一個(gè)元素,for循環(huán)寫好條件后以冒號(hào)結(jié)束,并換行縮進(jìn),第二行是針對(duì)每次循環(huán)執(zhí)行的語(yǔ)句,這里是打印列表a中的每一個(gè)元素。 a = [1,2,3,4,5] 上述操作也可以通過(guò)遍歷一個(gè)可迭代對(duì)象的索引來(lái)完成,a列表一共5個(gè)元素,range(len(a))表示生成a的索引序列,這里打印索引并打印a向量索引下的取值。 a = ['Mary', 'had', 'a', 'little', 'lamb'] 4.2 while循環(huán) while循環(huán)一般會(huì)設(shè)定一個(gè)終止條件,條件會(huì)隨著循環(huán)的運(yùn)行而發(fā)生變化,當(dāng)條件滿足時(shí),循環(huán)終止。while循環(huán)可以通過(guò)條件制定循環(huán)次數(shù),例如通過(guò)計(jì)數(shù)器來(lái)終止掉循環(huán),如下所示,計(jì)數(shù)器count每循環(huán)一次自增1,但count為5時(shí),while條件為假,終止循環(huán)。 count = 1 以下是一個(gè)比較特殊的示例,演示如何按照指定條件循環(huán)而不考慮循環(huán)的次數(shù),例如編寫循環(huán),使x不斷減少,當(dāng)x小于0.0001時(shí)終止循環(huán),如下所示,循環(huán)了570次,最終x取值滿足條件,循環(huán)終止。 x=10 4.3 break、continue、pass 上例中while循環(huán)代碼中使用了break表示滿足條件時(shí)終止循環(huán)。此外,也可通過(guò)continue、pass對(duì)循環(huán)進(jìn)行控制。Continue表示繼續(xù)進(jìn)行循環(huán),例如如下代碼嘗試打印10以內(nèi)能夠被3整除的整數(shù),注意continue和break的區(qū)別: count = 0 使用break: count = 0 pass語(yǔ)句一般是為了保持程序的完整性而作為占位符使用,例如以下代碼中pass沒有任何操作。 count = 0 4.4 表達(dá)式 在Python中,諸如列表、元組、集合、字典都是可迭代對(duì)象,Python為這些對(duì)象的遍歷提供了更加簡(jiǎn)潔的寫法。例如如下列表對(duì)象x的遍歷,且每個(gè)元素取值除以10: x = [1,2,3,4,5] 上述[i/10 for i in x]的寫法稱為列表表達(dá)式,這種寫法比f(wàn)or循環(huán)更加簡(jiǎn)便。此外對(duì)于元組對(duì)象、集合對(duì)象、字典對(duì)象,這種寫法依舊適用,最終產(chǎn)生一個(gè)列表對(duì)象。 x = (1,2,3,4,5) #元組 此外Python還支持集合表達(dá)式與字典表達(dá)式用于創(chuàng)建集合、字典,例如如下形式創(chuàng)建集合: {i for i in [1,1,1,2,2]} 字典表達(dá)式可以以如下方式創(chuàng)建: {key:value for key,value in [('a',1),('b',2),('c',3)]} 04 Python的函數(shù)與模塊 1. Python的函數(shù) 函數(shù)是用來(lái)封裝特定功能的實(shí)體,可對(duì)不同類型和結(jié)構(gòu)的數(shù)據(jù)進(jìn)行操作,達(dá)到預(yù)定目標(biāo)。像之前的數(shù)據(jù)類型轉(zhuǎn)換函數(shù)入str,float等就屬于函數(shù)。當(dāng)然除了python的內(nèi)置函數(shù)與第三方庫(kù)的函數(shù)外,還可以自定義函數(shù)從而完成指定任務(wù)。 1.1 自定義函數(shù)示例 例如自定義求一個(gè)列表對(duì)象均值的函數(shù)avg,sum與len函數(shù)是python內(nèi)置函數(shù),分別表示求和與長(zhǎng)度: def avg(x): 運(yùn)行完畢后,就可以調(diào)用該函數(shù)進(jìn)行運(yùn)算了: avg([23,34,12,34,56,23]) 1.2 函數(shù)的參數(shù) 函數(shù)的參數(shù)可以分為形式參數(shù)與實(shí)際參數(shù),形式參數(shù),形式參數(shù)作用于函數(shù)的內(nèi)部,其不是一個(gè)實(shí)際存在的變量,當(dāng)接受一個(gè)具體值時(shí)(實(shí)際參數(shù)),負(fù)責(zé)將具體值傳遞到函數(shù)內(nèi)部進(jìn)行運(yùn)算,例如之前定義的函數(shù)avg,形式參數(shù)為x。 def avg(x): 實(shí)際參數(shù)即具體值,通過(guò)形式參數(shù)傳遞到函數(shù)內(nèi)部參與運(yùn)算并輸出結(jié)果,剛才的例子中,實(shí)際參數(shù)為一個(gè)列表: >avg([23,34,12,34,56,23]) 函數(shù)參數(shù)的傳遞有兩種方式:按位置和按關(guān)鍵字。當(dāng)函數(shù)的形式參數(shù)過(guò)多時(shí),一般采用按關(guān)鍵字傳遞的方式,通過(guò)形式參數(shù)名=實(shí)際參數(shù)的方式傳遞參數(shù),如下所示,函數(shù)age有四個(gè)參數(shù),可以通過(guò)指定名稱的方式使用,也可按照順序進(jìn)行匹配: def age(a,b,c,d): 函數(shù)的參數(shù)中,亦可以指定形式參數(shù)的默認(rèn)值,此時(shí)該參數(shù)稱為可選參數(shù),表示使用時(shí)可以不定義實(shí)際參數(shù),例如如下例子,函數(shù)f有兩個(gè)參數(shù),其中參數(shù)L指定了默認(rèn)值None: def f(a, L=None): 使用該函數(shù)時(shí),只需指定a參數(shù)的值,該函數(shù)返回一個(gè)列表對(duì)象,若不給定初始列表L,則創(chuàng)建一個(gè)列表,再將a加入到列表中: f(3) 也可指定可選參數(shù)L的取值: f(3,L = [1,2]) 1.3 匿名函數(shù)lambda Python中設(shè)定了匿名函數(shù)lambda,簡(jiǎn)化了自定義函數(shù)定義的書寫形式。使得代碼更為簡(jiǎn)潔。例如通過(guò)lambda函數(shù)定義一個(gè)函數(shù)g: g = lambda x:x+1 該函數(shù)相當(dāng)于如下自定義函數(shù): def g(x): 2. Python的模塊 為了編寫可維護(hù)的代碼,可以把很多函數(shù)分組,分別放到不同的文件里,這樣,每個(gè)文件包含的代碼就相對(duì)較少,很多編程語(yǔ)言都采用這種組織代碼的方式。在Python中,一個(gè).py文件就稱之為一個(gè)模塊(Module),其內(nèi)容形式是文本,可以在IDE中或者使用常用的文本編輯器進(jìn)行編輯。
使用文本編輯器創(chuàng)建一個(gè)mod.py文件,其中包含一個(gè)函數(shù),如下所示: # module 使用自定義模塊時(shí),將mod.py放置在工作目錄下,通過(guò)“import 文件名”命令載入: import mod 在使用該模塊的函數(shù)時(shí),需要加入模塊名的信息,如下: mod.mean([1,2,3]) 載入模塊還有很多方式,如下(注意別名的使用): import mod as m# as后表示別名
import命令還可以載入已經(jīng)下載好的第三方庫(kù),使用方式與上面所展示的一致。例如,載入numpy模塊: import numpyas np 此時(shí)就可以使用Numpy模塊中的函數(shù)了,例如Numpy中提供的基本統(tǒng)計(jì)函數(shù): x = [1,2,3,4,5] Numpy提供了強(qiáng)大的多維數(shù)組、向量、稠密矩陣、稀疏矩陣等對(duì)象,支持線性代數(shù)、傅里葉變換等科學(xué)運(yùn)算,提供了C/C++及Fortron代碼的整合工具。 Numpy的執(zhí)行效率要比Python自帶的數(shù)據(jù)結(jié)構(gòu)要高效的多,在Numpy的基礎(chǔ)上,研究者們開發(fā)了大量用于統(tǒng)計(jì)學(xué)習(xí)、機(jī)器學(xué)習(xí)等科學(xué)計(jì)算的框架,基于Numpy的高效率,這些計(jì)算框架具備了較好的實(shí)用性。可以說(shuō), Numpy庫(kù)極大地推動(dòng)了Python在數(shù)據(jù)科學(xué)領(lǐng)域的流行。 若不太清楚如何使用Python 中(含第三方包和庫(kù))的方法和對(duì)象,可以查閱相關(guān)文檔或使用幫助功能,代碼中獲取幫助信息的方式有多種,比如如下幾種: ?np.mean 05 pandas 讀取結(jié)構(gòu)化數(shù)據(jù) Numpy中的多維數(shù)組、矩陣等對(duì)象具備極高的執(zhí)行效率,但是在商業(yè)數(shù)據(jù)分析中,我們不僅需要一堆數(shù)據(jù),還需要了解各行、列的意義,同時(shí)會(huì)有針對(duì)結(jié)構(gòu)化數(shù)據(jù)的相關(guān)計(jì)算,這些是Numpy不具備的。為了方便分析,研究者們開發(fā)了Pandas用于簡(jiǎn)化對(duì)結(jié)構(gòu)化數(shù)據(jù)的操作。 Pandas是一個(gè)基于Numpy開發(fā)的更高級(jí)的結(jié)構(gòu)化數(shù)據(jù)分析工具,提供了Series、DataFrame、Panel等數(shù)據(jù)結(jié)構(gòu),可以很方便地對(duì)序列、截面數(shù)據(jù)(二維表)、面板數(shù)據(jù)進(jìn)行處理。 DataFrame即是我們常見的二維數(shù)據(jù)表,包含多個(gè)變量(列)和樣本(行),通常稱為數(shù)據(jù)框;Series是一個(gè)一維結(jié)構(gòu)的序列,會(huì)包含指定的索引信息,可以視作是DataFrame中的一列或一行,操作方法與DataFrame十分相似;Panel是包含序列及截面信息的三維結(jié)構(gòu),通常稱為面板數(shù)據(jù),通過(guò)截取會(huì)獲得對(duì)應(yīng)的Series和DataFrame。 由于這些對(duì)象的常用操作方法是十分相似的,本節(jié)讀取與保存數(shù)據(jù)以及后續(xù)章節(jié)進(jìn)行的數(shù)據(jù)操作,都主要使用DataFrame進(jìn)行演示。 1. 讀取數(shù)據(jù) 1.1 使用Pandas讀取文件 Python的Pandas庫(kù)提供了便捷讀取本地結(jié)構(gòu)化數(shù)據(jù)的方法,這里主要以csv數(shù)據(jù)為例。pandas.read_csv函數(shù)可以實(shí)現(xiàn)讀取csv數(shù)據(jù),讀取方式見以下代碼,其中'data/sample.csv'表示文件路徑: import pandas as pd 按照通常的慣例,Pandas會(huì)以pd做為別名,pd.read_csv讀取指定路徑下的文件,然后返回一個(gè)DataFrame對(duì)象。在命令行中打印DataFrame對(duì)象其可讀性可能會(huì)略差一些,如果在jupyter notebook 中執(zhí)行的話,則DataFrame的可讀性會(huì)大幅提升: ▲圖3-2 jupyter notebook中的DataFrame展現(xiàn) 打印出來(lái)的DataFrame包含了索引(index,第一列),列名(column,第一行)及數(shù)據(jù)內(nèi)容(values,除第一行和第一列之外的部分)。 此外,read_csv函數(shù)有很多參數(shù)可以設(shè)置,這里列出常用參數(shù),如表3-3所示。
▲表3-3 pandas.read_csv參數(shù)一覽 Pandas除了可以直接讀取csv、Excel、Json、html等文件生成DataFrame,也可以從列表、元組、字典等數(shù)據(jù)結(jié)構(gòu)創(chuàng)建DataFrame, 1.2 讀取指定行和指定列 使用參數(shù)usecol和nrows讀取指定的列和前n行,這樣可以加快數(shù)據(jù)讀取速度。如下所示,讀取原數(shù)據(jù)的兩列、兩行: csv = pd.read_csv('data/sample.csv',\ 1.3 使用分塊讀取 參數(shù)chunksize可以指定分塊讀取的行數(shù),此時(shí)返回一個(gè)可迭代對(duì)象,這里big.csv是一個(gè)4500行4列的csv數(shù)據(jù),這里設(shè)定chunksize=900,分5塊讀取數(shù)據(jù),每塊900行,4個(gè)變量,如下所示: csvs = pd.read_csv('data/big.csv',chunksize=900) 可以使用pd.concat函數(shù)再讀取全部數(shù)據(jù)。 csvs = pd.read_csv('data/big.csv',chunksize=900) 1.4 缺失值操作 使用na_values參數(shù)指定預(yù)先定義的缺失值,數(shù)據(jù)sample.csv中,“小青”的分?jǐn)?shù)有取值為99999的情況,這里令其讀取為缺失值,操作如下 csv = pd.read_csv('data/sample.csv', 1.5 文件編碼 讀取數(shù)據(jù)時(shí),常遇到亂碼的情況,這里需要先弄清楚原始數(shù)據(jù)的編碼形式是什么,再以指定的編碼形式進(jìn)行讀取,例如sample.csv編碼為'utf-8',這里以指定編碼(參數(shù)encoding)讀取。 csv = pd.read_csv('data/sample.csv', 2. 寫出數(shù)據(jù) pandas的數(shù)據(jù)框?qū)ο笥泻芏喾椒?,其中方法“to_csv”可以將數(shù)據(jù)框?qū)ο笠詂sv格式寫入到本地中。to_csv方法的常見參數(shù)見表3-4:
▲表3-4 pandas.to_csv參數(shù)一覽 例如以以下方式寫出,'data/write.csv'表示寫出的路徑,encoding = 'utf-8'表示以'utf-8'編碼方式輸出,index=False表示不寫出索引列。 |
|