日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

最全攻略:数据分析师必备Python编程基础知识

發布時間:2025/3/15 python 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最全攻略:数据分析师必备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{1245}

?

需要注意集合不支持通過索引訪問指定元素。

?

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编程基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。