最全攻略:数据分析师必备Python编程基础知识
導讀:本文主要介紹使用Python進行數據分析時必備的編程基礎知識,主要涉及Python的基本數據類型、數據結構、程序控制、讀寫數據等內容。
?
Python編寫代碼時,是以縮進作為代碼塊的標識,而不是使用花括號等字符,這與其它語言有較大差別。這種方式顯示的代碼可讀性更高,通常使用四個空格或一個tab作縮進,如果是Python編程的新手,要注意這一點。
?
作者:常國珍、趙仁乾、張秋劍
本文摘編自《Python數據科學:技術詳解與商業實踐》,如需轉載請聯系大數據(ID:hzdashuju)
?
?
01 Python的基本數據類型
?
Python的基本數據類型包括幾種,如下表:
?
| 名稱 | 解釋 | 示例 |
| str | 字符串 | 'a',"1" |
| float | 浮點數 | 1.23,11.0 |
| int | 整數 | 3,4 |
| bool | 布爾 | True,False |
| complex | 復數 | 1+2j,2+0j |
▲表3-1 Python基礎數據類型
?
下面一一進行詳述。
?
1. 字符串(str)
?
Python中,單引號、雙引號、三引號包圍的都是字符串,如下所示:
?
'spam?eggs' 'spam?eggs'"spam?eggs" 'spam?eggs''''spam?eggs''' 'spam?eggs'type('spam?eggs') str?
此外,Python中的字符串也支持一些格式化輸出,例如換行符“\n”和制表符“\t”:
?
print('First?line.\nSecond?line.') First?line. Second?line.print('1\t2') 1????2?
當然,有時候為避免混淆,也會使用轉義字符“\”,用于轉義“\”后一位的字符為原始輸出。
?
"\"Yes,\"?he?said." '"Yes,"?he?said.'?
此外還可以通過在引號前加r來表示原始輸出:
?
print('C:\some\name')??#有換行符的輸出 C:\some Ameprint(r'C:\some\name')?#原始輸出 C:\some\name?
Python中字符串支持加運算表示字符串拼接:
?
'pyt'+'hon' 'python'?
2. 浮點數和整數(float,int)
?
Python可以處理任意大小的整數,當然包括負整數,在程序中的表示方法和數學上的寫法一模一樣。
?
?1+1 2?
Python支持數值的四則運算,如下所示:
?
?1+1?#加法 21-1?#減法 01*1?#乘法 12**2?#2的2次方 42/3?#除法 0.66666666666666665//2?#除法(整除) 25%2?#余數 1?
Python可以處理雙精度浮點數,可以滿足絕大部分數據分析的需求,要精確空值數字精度,還可以使用numpy擴展庫。
?
此外,可以使用內置函數進行數值類型轉換,例如轉換數值字符為數值:
?
float("1") 1.0 int("1") 1?
3. 布爾值 (Bool:True/False)
?
Python布爾值一般通過邏輯判斷產生,只有兩個可能結果:True/False
?
整型、浮點型的“0”和復數0+0j也可以表示False,其余整型、浮點型、復數數值都被判斷為True,如下代碼通過邏輯表達式創建bool邏輯值:
?
1?==?1 True 1?>?3 False'a'?is?'a' True?
當然,Python中提供了邏輯值的運算即“且”、“或”、“非”運算,
?
True?and?False?#且 FalseTrue?or?False?#或 Truenot?True?#非 False?
布爾邏輯值轉換可以使用內置函數bool,除數字0外,其他類型用bool轉換結果都為True。
?
bool(1) Falsebool("0")? Truebool(0) False?
Python中對象類型轉換可參考表3-2。
?
| 數據類型 | 中文含義 | 轉換函數 |
| Str | 字符串 | str() |
| Float | 浮點類型 | float() |
| Int | 整數 | Int() |
| Bool | 邏輯 | bool() |
| Complex | 復數 | complex() |
▲表3-2 Python數據類型轉換
?
4. 其他
?
Python中,還有一些特殊的數據類型,例如無窮值,nan(非數值),None等。可以通過以下方式創建:
?
float('-inf')?#負無窮 -inffloat('+inf')?#正無窮 inf?
下面是無窮值的一些運算,注意正負無窮相加返回nan(not a number),表示非數值
?
float('-inf')+1 -inffloat('-inf')/-1 inffloat('+inf')+1 inffloat('+inf')/-1 -inffloat('-inf')+float('+inf') nan?
非數值nan在Python中與任何數值的運算結果都會產生nan,nan甚至不等于自身。如下所示。nan可用于表示缺失值。
?
float('nan')?==?float('nan') False?
此外,python中提供了None來表示空,其僅僅支持判斷運算,如下所示
?
x?=?Nonex?is?None True?
?
02 Python的基本數據結構
?
Python的基本數據類型包括以下幾種,這些數據類型表示了自身在Python中的存儲形式。在Python中可以輸入type(對象)查看數據類型。
?
1. 列表(list)
?
1.1 列表簡介
?
列表list是Python內置的一種數據類型,是一種有序的集合,用來存儲一連串元素的容器,列表用[]來表示,其中元素的數據類型可不相同。
?
list1?=?[1,'2',3,4] list1 [1,'2',3,4]?
除了使用“[]”創建列表外,還可以使用list()函數:
?
list([1,2,3]) [1,?2,?3]list('abc') ['a',?'b',?'c']?
可以通過索引對訪問或修改列表相應位置的元素,使用索引時,通過”[]”來指定位置。在Python中,索引的起始位置為0,例如取list1的第一個位置的元素:
?
list1[0] 1?
可以通過”:”符號選取指定序列的位置的元素,例如取第1到第3個位置的元素,注意這種索引取數是前包后不包的(包括0位置,但不包括3位置,即取0,1,2位置的元素):
?
list1[0:3][1,?'2',?3]?
此外,Python中的負索引表示倒序位置,例如-1代表list1最后一個位置的元素:
?
list1[-1]4?
列表支持加法運算,表示兩個或多個列表合并為一個列表,如下所示:
?
[1,2,3]+[4,5,6][1,?2,?3,?4,?5,?6]?
1.2 列表的方法
?
Python中,列表對象內置了一些方法。這里介紹append方法和extend方法,append方法表示在現有列表中添加一個元素,在循環控制語句中,append方法使用較多,以下是示例:
?
list2?=?[1,2] list2.append(3) list2[1?,2?,3]?
extend方法類似于列表加法運算,表示合并兩個列表為一個列表:
?
list2?=?[1,2] list2.extend([3,4,5]) list2[1,?2,?3,?4,5]?
2. 元組(tuple)
?
元組與列表類似,區別在于在列表中,任意元素可以通過索引進行修改。而元組中,元素不可更改,只能讀取。下面展示了元組和列表的區別,列表可以進行賦值,而同樣的操作應用于元組則報錯。
?
list0?=?[1,2,3] tuple0?=?(1,2,3) list0[1]?=?'a' list0[1,?'a',?3]tuple0[1]?=?'a' TypeError??????Traceback?(most?recent?call?last) <ipython-input-35-2bfd4f0eedf9>?in?<module>() ---->?1?tuple0[1]?=?'a' TypeError:?'tuple'?object?does?not?support?item?assignment?
這里通過”()”創建元組,python中,元組類對象一旦定義雖然無法修改,但支持加運算,即合并元組。
?
(1,2,3)+(4,5,6)?(1,?2,?3,?4,?5,?6)?
元組也支持像列表那樣通過索引方式進行訪問。
?
t1?=?(1,2,3)t1[0] 1t1[0:2] (1,2)?
3. 集合(set)
?
Python中,集合(set)是一組key的集合,其中key不能重復。可以通過列表、字典或字符串等創建集合,或通過“{}”符號進行創建。Python中集合主要有兩個功能,一個功能是進行集合操作,另一個功能是消除重復元素。
?
basket?=?{'apple',?'orange',?'apple',?'pear',?'orange',?'banana'} basket {'apple',?'banana',?'orange',?'pear'}basket?=?set(['apple',?'orange',?'apple',?'pear',?'orange',?'banana']) basket {'apple',?'banana',?'orange',?'pear'}basket?=?set(('apple',?'orange',?'apple',?'pear',?'orange',?'banana')) basket {'apple',?'banana',?'orange',?'pear'}?
Python支持數學意義上的集合運算,比如差集、交集、補集、并集等,例如如下集合:
?
A?=?{1,2,3} B?=?{3,4,5}?
A,B的差集,即集合A的元素去除AB共有的元素:
?
A?–?B{1,?2}?
A,B的并集,即集合A與集合B的全部唯一元素:
?
A?|?B{1,?2,?3,?4,?5}?
A,B的交集,即集合A和集合B共有的元素:
?
A?&?B{3}?
A,B的對稱差,即集合A與集合B的全部唯一元素去除集合A與集合B的公共元素:
?
A?^?B{1,2,4,5}?
需要注意集合不支持通過索引訪問指定元素。
?
4. 字典(dict)
?
Python內置了字典dict,在其他語言中也稱為map,使用鍵-值(key-value)存儲,具有極快的查找速度,其格式是用大括號{}括起來key和value用冒號“:”進行對應。例如以下代碼創建了一個字典:
?
dict1?=?{'Nick':28,'Lily':28,'Mark':24}dict1{'Lily':?28,?'Mark':?24,?'Nick':?28}?
字典本身是無序的,可以通過方法keys和values取字典鍵值對中的鍵和值,如下所示:
?
dict1.keys() ['Nick',?'Lily',?'Mark']dict1.values()[28,?28,?24]?
字典支持按照鍵訪問相應值的形式,如下所示:
?
dict1['Lily']28?
這里需要注意定義字典時,鍵不能重復,否則重復的鍵值會替代原先的鍵值,如下所示,鍵’Lily’產生重復,其值被替換。
?
dict3?=?{'Nick':28,'Lily':28,'Mark':24,'Lily':33}{'Lily':?33,?'Mark':?24,?'Nick':?28}?
?
03 Python的程序控制
?
程序控制結構是編程語言的核心基礎,Python的編程結構有3種,本節將詳細地介紹這3種結構。
?
1. 三種基本的編程結構簡介
?
簡單來說,程序結構分為三種:順承結構、分支結構和循環結構(圖3-1)。
?
▲圖3-1程序執行結構
?
-
順承結構的程序特點是依照次序將代碼一個一個地執行,并返回相應的結果,這種結構較為簡單,易于理解;
-
分支結構的程序多出了條件判斷,即滿足某種條件就繼續執行,否則跳轉到另外的條件上進行執行;
-
循環結構用于處理可以迭代的對象,這種結構通過循環可迭代的對象,然后對每一個對象執行程序并產生結果。在迭代次數較多的情況下,使用順承結構往往要寫非常長的代碼,而循環結構則非常簡單。?
?
這些結構中,分支結構往往需要條件判斷語句進行控制,比如if、else等,而循環結構則需要循環語句for進行控制,當然分支結構與循環結構完全可以混合,這時就可以通過條件循環語句while進行控制。?
?
下面我們具體看看這幾個結構的程序。
?
2. 順承結構
?
2.1 順承結構
?
現在創建一個列表a:
?
a?=?[1,2,3,4,5]?
需要打印列表a中的所有元素,可以有如下寫法,雖然煩瑣但完成了任務。這種順序執行的編程結構就是順承結構:
?
print(a[0]) print(a[1]) print(a[2]) print(a[3]) print(a[4])1 2 3 4 5?
2.2 邏輯行與物理行
?
Python中,代碼是逐行提交給解釋器進行編譯的,這里的一行稱為邏輯行,實際代碼也確實是一行,那么代碼的物理行就只有一行,例如上述print代碼,邏輯行和物理行是統一的。
?
但某些情況下,編寫者寫入一個邏輯行的代碼過長時,可以分拆為多個物理行執行,例如:
?
tuple(set(list([1,2,3,4,5,6,7,8]))) (1,?2,?3,?4,?5,?6,?7,?8)?
可以寫為如下方式,符號’\’是換行的標識,此時代碼還是一個邏輯行,但有兩個物理行。
?
tuple(set(list([1,2,3,\4,5,6,7,8]))) (1,?2,?3,?4,?5,?6,?7,?8)?
當多個邏輯行代碼過短時:
?
x?=?1 y?=?2 z?=?3 print(x,y,z)(1,?2,?3)?
可以使用分號“;”將多個邏輯行轉化為一個物理行執行:
?
x?=?1;y?=?2;z?=?3;print(x,y,z)(1,?2,?3)?
3. 分支結構
?
分支結構的分支用于進行條件判斷,Python中,使用if 、elif、else、冒號與縮進表達。詳細語法可見以下示例,下面的語法的判斷邏輯為 :?
?
-
若數值x小于0,令x等于0,若成立則打印信息'Negative changed to zero';
-
若第一個條件不成立,判斷x是否為0,若成立打印'Zero';
-
若第一、第二個條件不成立,再判斷x是否為1,若成立打印’single’;
-
若第一、第二、第三個條件都不成立,打印’more’。
?
以x=-2測試結果:
?
x?=?-2 if?x?<?0:?x?=?0print('Negative?changed?to?zero') elif?x?==?0:?print('Zero') elif?x?==?1:?print('Single') else:?print('More')'Negative?changed?to?zero'?
這里,if,elif,else組成的邏輯是一個完整的邏輯,即程序執行的時,任何條件成立時,會停止后面的條件判斷。這里需注意,當多個if存在時的條件判斷的結果:若把上述代碼中的elif改為if后,程序執行的結果會發生變化,如下所示:
?
?x?=?-2 if?x?<?0:?x?=?0print('Negative?changed?to?zero') if?x?==?0:?print('Zero') if?x?==?1:?print('Single') else:?print('More') 'Negative?changed?to?zero' 'Zero' 'More'?
此時,上述程序的中任何if判斷結果無論是否成立都會依次執行一遍,所以x=-2會被賦值為0后繼續執行,第二個if判斷為真,第三個if判斷為假時,再跳到else進行執行,此時第三個if和else才是一個完整的邏輯。在寫條件判斷結構的程序時需要注意。
?
4. 循環結構
?
這里介紹Python中的for循環結構和while循環結構,循環語句用于遍歷枚舉一個可迭代對象的所有取值或其元素,每一個被遍歷到的取值或元素執行指定的程序并輸出。這里可迭代對象指可以被遍歷的對象,比如列表、元組、字典等。
?
4.1 For循環
?
下面是一個for循環的例子, i用于指代一個可迭代對象中a中的一個元素,for循環寫好條件后以冒號結束,并換行縮進,第二行是針對每次循環執行的語句,這里是打印列表a中的每一個元素。
?
a?=?[1,2,3,4,5] for?i?in?a:print(i)1 2 3 4 5?
上述操作也可以通過遍歷一個可迭代對象的索引來完成,a列表一共5個元素,range(len(a))表示生成a的索引序列,這里打印索引并打印a向量索引下的取值。
?
a?=?['Mary',?'had',?'a',?'little',?'lamb'] for?i?in?range(len(a)):print(i,?a[i])(0,?'Mary') (1,?'had') (2,?'a') (3,?'little') (4,?'lamb')?
4.2 while循環
?
while循環一般會設定一個終止條件,條件會隨著循環的運行而發生變化,當條件滿足時,循環終止。while循環可以通過條件制定循環次數,例如通過計數器來終止掉循環,如下所示,計數器count每循環一次自增1,但count為5時,while條件為假,終止循環。
?
count?=?1 while?count?<?5:count?=?count?+?1print(count)2 3 4 5?
以下是一個比較特殊的示例,演示如何按照指定條件循環而不考慮循環的次數,例如編寫循環,使x不斷減少,當x小于0.0001時終止循環,如下所示,循環了570次,最終x取值滿足條件,循環終止。
?
x=10 count?=?0? while?True:count?=?count?+?1x?=?x?-?0.02*xif?x<?0.0001:break print?(x,count)(9.973857171889038e-05,?570)?
4.3 break、continue、pass
?
上例中while循環代碼中使用了break表示滿足條件時終止循環。此外,也可通過continue、pass對循環進行控制。Continue表示繼續進行循環,例如如下代碼嘗試打印10以內能夠被3整除的整數,注意continue和break的區別:
?
count?=?0? while?count?<?10:count?=?count?+?1if?count?%?3?==?0:print(count)??continue3 6 9?
使用break:
?
count?=?0? while?count?<?10:count?=?count?+?1 if?count?%?3?==?0:print(count)??break3?
pass語句一般是為了保持程序的完整性而作為占位符使用,例如以下代碼中pass沒有任何操作。
?
count?=?0? while?count?<?10:count?=?count?+?1if?count?%?3?==?0:pass else:print(count)1 2 4 5 7 8 10?
4.4 表達式
?
在Python中,諸如列表、元組、集合、字典都是可迭代對象,Python為這些對象的遍歷提供了更加簡潔的寫法。例如如下列表對象x的遍歷,且每個元素取值除以10:
?
x?=?[1,2,3,4,5] [i/10?for?i?in?x] [0.1,?0.2,?0.3,?0.4,?0.5]?
上述[i/10 for i in x]的寫法稱為列表表達式,這種寫法比for循環更加簡便。此外對于元組對象、集合對象、字典對象,這種寫法依舊適用,最終產生一個列表對象。
?
x?=?(1,2,3,4,5)?#元組 [i/10?for?i?in?x][0.1,?0.2,?0.3,?0.4,?0.5]x?=?set((1,2,3,4,5))#集合 [i/10?for?i?in?x][0.1,?0.2,?0.3,?0.4,?0.5]x?=?{'a':2,'b':2,'c':5}#字典 [i?for?i?in?x.keys()]['a',?'c',?'b'][i?for?i?in?x.values()][1,?3,?2]?
此外Python還支持集合表達式與字典表達式用于創建集合、字典,例如如下形式創建集合:
?
{i?for?i?in?[1,1,1,2,2]}?{1,?2}?
字典表達式可以以如下方式創建:
?
{key:value?for?key,value?in?[('a',1),('b',2),('c',3)]}{'a':?1,?'b':?2,?'c':?3}?
?
04 Python的函數與模塊
?
1. Python的函數
?
函數是用來封裝特定功能的實體,可對不同類型和結構的數據進行操作,達到預定目標。像之前的數據類型轉換函數入str,float等就屬于函數。當然除了python的內置函數與第三方庫的函數外,還可以自定義函數從而完成指定任務。
?
1.1 自定義函數示例
?
例如自定義求一個列表對象均值的函數avg,sum與len函數是python內置函數,分別表示求和與長度:
?
def?avg(x):mean_x?=?sum(x)/len(x)return(mean_x)?
運行完畢后,就可以調用該函數進行運算了:
?
avg([23,34,12,34,56,23])30?
1.2 函數的參數
?
函數的參數可以分為形式參數與實際參數,形式參數,形式參數作用于函數的內部,其不是一個實際存在的變量,當接受一個具體值時(實際參數),負責將具體值傳遞到函數內部進行運算,例如之前定義的函數avg,形式參數為x。
?
def?avg(x):mean_x?=?sum(x)/len(x)return(mean_x)?
實際參數即具體值,通過形式參數傳遞到函數內部參與運算并輸出結果,剛才的例子中,實際參數為一個列表:
?
>avg([23,34,12,34,56,23])?
函數參數的傳遞有兩種方式:按位置和按關鍵字。當函數的形式參數過多時,一般采用按關鍵字傳遞的方式,通過形式參數名=實際參數的方式傳遞參數,如下所示,函數age有四個參數,可以通過指定名稱的方式使用,也可按照順序進行匹配:
?
def?age(a,b,c,d):print(a)print(b)print(c)print(d)age(a?=?'young',b?=?'teenager',c?=?'median',d?=?'old')?#按關鍵字指定名稱young teenager median oldage('young','teenager','median','old')?#按位置順序匹配young teenager median old?
函數的參數中,亦可以指定形式參數的默認值,此時該參數稱為可選參數,表示使用時可以不定義實際參數,例如如下例子,函數f有兩個參數,其中參數L指定了默認值None:
?
def?f(a,?L=None):if?L?is?None:L?=?[]L.append(a)return?L?
使用該函數時,只需指定a參數的值,該函數返回一個列表對象,若不給定初始列表L,則創建一個列表,再將a加入到列表中:
?
f(3)[3]?
也可指定可選參數L的取值:
?
f(3,L?=?[1,2])[1,?2,?3]?
1.3 匿名函數lambda
?
Python中設定了匿名函數lambda,簡化了自定義函數定義的書寫形式。使得代碼更為簡潔。例如通過lambda函數定義一個函數g:
?
g?=?lambda?x:x+1 g(1)2?
該函數相當于如下自定義函數:
?
def?g(x):return(x+1) g(1)2?
2. Python的模塊
?
為了編寫可維護的代碼,可以把很多函數分組,分別放到不同的文件里,這樣,每個文件包含的代碼就相對較少,很多編程語言都采用這種組織代碼的方式。在Python中,一個.py文件就稱之為一個模塊(Module),其內容形式是文本,可以在IDE中或者使用常用的文本編輯器進行編輯。
?
-
自定義模塊
?
使用文本編輯器創建一個mod.py文件,其中包含一個函數,如下所示:
?
#?module def?mean(x): return(sum(x)/len(x))?
使用自定義模塊時,將mod.py放置在工作目錄下,通過“import 文件名”命令載入:
?
import?mod?
在使用該模塊的函數時,需要加入模塊名的信息,如下:
?
mod.mean([1,2,3])2?
載入模塊還有很多方式,如下(注意別名的使用):
?
import?mod?as?m#?as后表示別名 m.mean([1,2,3])2from?modimport?mean?#從mod中載入指定函數mean mean([1,2,3])2from?modimport?*?#?從mod中載入所有函數 mean([1,2,3])2?
-
載入第三方庫
?
import命令還可以載入已經下載好的第三方庫,使用方式與上面所展示的一致。例如,載入numpy模塊:
?
import?numpyas?np?
此時就可以使用Numpy模塊中的函數了,例如Numpy中提供的基本統計函數:
?
x?=?[1,2,3,4,5] np.mean(x)#?均值3.0np.max(x)#?最大值5np.min(x)#?最小值1np.std(x)#?標準差1.41421356237np.median(x)#?中位數3.0?
Numpy提供了強大的多維數組、向量、稠密矩陣、稀疏矩陣等對象,支持線性代數、傅里葉變換等科學運算,提供了C/C++及Fortron代碼的整合工具。
?
Numpy的執行效率要比Python自帶的數據結構要高效的多,在Numpy的基礎上,研究者們開發了大量用于統計學習、機器學習等科學計算的框架,基于Numpy的高效率,這些計算框架具備了較好的實用性。可以說, Numpy庫極大地推動了Python在數據科學領域的流行。
?
若不太清楚如何使用Python 中(含第三方包和庫)的方法和對象,可以查閱相關文檔或使用幫助功能,代碼中獲取幫助信息的方式有多種,比如如下幾種:
?
?np.mean ??np.mean help(np.mean) np.mean???
?
05 pandas 讀取結構化數據
?
Numpy中的多維數組、矩陣等對象具備極高的執行效率,但是在商業數據分析中,我們不僅需要一堆數據,還需要了解各行、列的意義,同時會有針對結構化數據的相關計算,這些是Numpy不具備的。為了方便分析,研究者們開發了Pandas用于簡化對結構化數據的操作。
?
Pandas是一個基于Numpy開發的更高級的結構化數據分析工具,提供了Series、DataFrame、Panel等數據結構,可以很方便地對序列、截面數據(二維表)、面板數據進行處理。
?
DataFrame即是我們常見的二維數據表,包含多個變量(列)和樣本(行),通常稱為數據框;Series是一個一維結構的序列,會包含指定的索引信息,可以視作是DataFrame中的一列或一行,操作方法與DataFrame十分相似;Panel是包含序列及截面信息的三維結構,通常稱為面板數據,通過截取會獲得對應的Series和DataFrame。
?
由于這些對象的常用操作方法是十分相似的,本節讀取與保存數據以及后續章節進行的數據操作,都主要使用DataFrame進行演示。
?
1. 讀取數據
?
1.1 使用Pandas讀取文件
?
Python的Pandas庫提供了便捷讀取本地結構化數據的方法,這里主要以csv數據為例。pandas.read_csv函數可以實現讀取csv數據,讀取方式見以下代碼,其中'data/sample.csv'表示文件路徑:
?
import?pandas?as?pd csv?=?pd.read_csv('data/sample.csv') csvid?name???scores 0???1???小明?????78.0 1???2???小紅?????87.0 2???3???小白?????99.0 3???4???小青??99999.0 4???5???小蘭??????NaN?
按照通常的慣例,Pandas會以pd做為別名,pd.read_csv讀取指定路徑下的文件,然后返回一個DataFrame對象。在命令行中打印DataFrame對象其可讀性可能會略差一些,如果在jupyter notebook 中執行的話,則DataFrame的可讀性會大幅提升:
?
▲圖3-2 jupyter notebook中的DataFrame展現
?
打印出來的DataFrame包含了索引(index,第一列),列名(column,第一行)及數據內容(values,除第一行和第一列之外的部分)。
?
此外,read_csv函數有很多參數可以設置,這里列出常用參數,如表3-3所示。
?
| 參數 | 說明 |
| filepath_or_buffer | csv文件的路徑 |
| sep = ',' | 分隔符,默認逗號 |
| header = 0 | int或list of ints類型,0代表第一行為列名,若設定為None將使用數值列名 |
| names = [...] | list,重新定義列名,默認None |
| usecols = [...] | list,讀取指定列,設定后將縮短讀取數據的時間與內存消耗,適合大數據量讀取,默認None |
| dtype = {...} | dict,定義讀取列的數據類型,默認None |
| nrows = None | int類型,指定讀取大數據量的前多少行,默認None |
| na_values = ... | str類型,list或dict,指定讀取為缺失值的值 |
| na_filter = True | bool類型,自動發現數據中的缺失值功能,默認打開(True),若確定數據無缺失可以設定為False以提高數據載入的速度 |
| chunksize = 1000 | int類型,分塊讀取,當數據量較大時可以設定分塊讀取的行數,默認為None,若設定將返回一個迭代器 |
| encoding = 'utf-8' | str類型,數據的編碼,python3默認為'utf-8',python2默認為'ascii' |
▲表3-3 pandas.read_csv參數一覽
?
Pandas除了可以直接讀取csv、Excel、Json、html等文件生成DataFrame,也可以從列表、元組、字典等數據結構創建DataFrame,
?
1.2 讀取指定行和指定列
?
使用參數usecol和nrows讀取指定的列和前n行,這樣可以加快數據讀取速度。如下所示,讀取原數據的兩列、兩行:
?
csv?=?pd.read_csv('data/sample.csv',\usecols=['id','name'],\nrows=2)?#讀取'id'和'name'兩列,僅讀取前兩行 csvid?name 0???1???小明 1???2???小紅?
1.3 使用分塊讀取
?
參數chunksize可以指定分塊讀取的行數,此時返回一個可迭代對象,這里big.csv是一個4500行4列的csv數據,這里設定chunksize=900,分5塊讀取數據,每塊900行,4個變量,如下所示:
?
csvs?=?pd.read_csv('data/big.csv',chunksize=900) for?i?in?csvs:print?(i.shape)(900,?4) (900,?4) (900,?4) (900,?4) (900,?4)?
可以使用pd.concat函數再讀取全部數據。
?
csvs?=?pd.read_csv('data/big.csv',chunksize=900) dat?=?pd.concat(csvs,ignore_index=True) dat.shape(4500,?4)?
1.4 缺失值操作
?
使用na_values參數指定預先定義的缺失值,數據sample.csv中,“小青”的分數有取值為99999的情況,這里令其讀取為缺失值,操作如下
?
csv?=?pd.read_csv('data/sample.csv',na_values='99999') csvid?name??scores 0???1???小明????78.0 1???2???小紅????87.0 2???3???小白????99.0 3???4???小青?????NaN 4???5???小蘭?????NaN?
1.5 文件編碼
?
讀取數據時,常遇到亂碼的情況,這里需要先弄清楚原始數據的編碼形式是什么,再以指定的編碼形式進行讀取,例如sample.csv編碼為'utf-8',這里以指定編碼(參數encoding)讀取。
?
csv?=?pd.read_csv('data/sample.csv',encoding='utf-8') csvid?name???scores 0???1???小明?????78.0 1???2???小紅?????87.0 2???3???小白?????99.0 3???4???小青??99999.0 4???5???小蘭??????NaN?
2. 寫出數據
?
pandas的數據框對象有很多方法,其中方法“to_csv”可以將數據框對象以csv格式寫入到本地中。to_csv方法的常見參數見表3-4:
?
| 參數 | 解釋 |
| path_or_buf | 寫到本地csv文件的路徑 |
| sep = ',' | 分隔符,默認逗號 |
| na_rep = '' | 缺失值寫入代表符號,默認'' |
| header = True | bool,是否寫入列名,默認True |
| cols = [...] | list,寫入指定列,默認None |
| index = True | bool,是否將行數寫入指定列,默認true |
| encoding = str | str,以指定編碼寫入 |
▲表3-4 pandas.to_csv參數一覽
?
例如以以下方式寫出,'data/write.csv'表示寫出的路徑,encoding = 'utf-8'表示以'utf-8'編碼方式輸出,index=False表示不寫出索引列。
?
csv.to_csv('data/write.csv',encoding='utf-8',ind?
關于作者:常國珍,數據科學專家和金融技術專家。北京大學會計學博士,中國大數據產業生態聯盟專家委員會委員。
趙仁乾,數據科學家,在電信大數據和機器學習領域有豐富的實踐經驗。
張秋劍,大數據專家和金融行業技術專家,上海師范大學計算機科學技術碩士。?
?
本文摘編自《Python數據科學:技術詳解與商業實踐》,經出版方授權發布。
?
延伸閱讀《Python數據科學》
點擊上圖了解及購買
轉載請聯系微信:togo-maruko
?
推薦語:本書從3個維度展開,技術維度:全面講解數據分析、數據挖掘和機器學習的核心技術;業務維度,圍繞具體的業務生命周期展開技術知識點的講解;實踐維度,列舉的全部是商業案例,通過案例為數據科學從業者提供工作模板。
?
?
據統計,99%的大咖都完成了這個神操作
▼
?
?
更多精彩
?
在公眾號后臺對話框輸入以下關鍵詞
查看更多優質內容!
?
PPT?|?報告?|?讀書?|?書單
大數據?|?揭秘?|?人工智能?|?AI
Python?|?機器學習?|?深度學習?|?神經網絡
可視化?|?區塊鏈?|?干貨?|?數學
?
猜你想看
?
-
王興:上天、入地、全球化,是互聯網下半場的三條路
-
輸在學歷的起跑線上?沒關系,10本書助你技能爆表升職加薪
-
2019升職加薪必備:你一定要修煉的產品思維
-
NLP將迎來黃金十年,7個案例帶你入門(附Python代碼)
?
?
Q:?最基礎的編程技巧你都搞定了嗎?
歡迎留言與大家分享
覺得不錯,請把這篇文章分享給你的朋友
轉載 / 投稿請聯系:baiyu@hzbook.com
更多精彩,請在后臺點擊“歷史文章”查看
點擊閱讀原文,了解更多
總結
以上是生活随笔為你收集整理的最全攻略:数据分析师必备Python编程基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 致敬百年南开!南开大学作译者30本必读经
- 下一篇: 月薪15k起,想进入这个行业有哪些书值得