python处理一亿条数据_Python基础数据处理库
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                python处理一亿条数据_Python基础数据处理库
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
                                Numpy 簡(jiǎn)介
import?numpy?as?np
Numpy是應(yīng)用Python進(jìn)行科學(xué)計(jì)算的基礎(chǔ)庫(kù)。它的功能包括多維數(shù)組、基本線性代數(shù)、基本統(tǒng)計(jì)計(jì)算、隨機(jī)模擬等。Numpy的核心功能是ndarray 類,即多維數(shù)組。多維數(shù)組是線性代數(shù)中非常廣泛的概念,如一維數(shù)組就是向量,二維數(shù)組是矩陣。在數(shù)組中,要求所有元素必須是同一類型,這是與列表與字典的區(qū)別之一一。針對(duì)數(shù)組,通過(guò)Numpy可以實(shí)現(xiàn)的基本操作包括數(shù)組的創(chuàng)建、數(shù)組切片、數(shù)組重組、數(shù)組運(yùn)算等。01
數(shù)組的創(chuàng)建
常見(jiàn)的創(chuàng)建數(shù)組的方法之一:轉(zhuǎn)換Python的列表、元組等數(shù)據(jù)結(jié)構(gòu)為數(shù)組類型。下面實(shí)例給出了創(chuàng)建數(shù)組的常用命令。>>> import?numpy?as?np??#?載入Numpy庫(kù)簡(jiǎn)寫(xiě)為"np">>> arr1?=?np.array([1,2,3,4,5,6])>>> arr1array([1,?2,?3,?4,?5,?6])>>> type(arr1) # 查看數(shù)據(jù)類型numpy.ndarray>>> arr1.shape # 各個(gè)維度的數(shù)組長(zhǎng)度(6,)>>> arr2?=?np.array([[1,2,3],[4,5,6]])>>>?arr2?array([[1, 2, 3], [4, 5, 6]])>>> arr2.shape(2,?3)另外,還可以利用Numpy的內(nèi)置函數(shù)來(lái)直接創(chuàng)建數(shù)組。>>> arr3?=?np.arange(0,1,0.1)>>> arr3array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])# 創(chuàng)建一維長(zhǎng)度為2,二維長(zhǎng)度為3的元素全為0的數(shù)組>>>?arr4?=?np.zeros((2,3))?>>>?arr4?array([[ 0., 0., 0.], [ 0., 0., 0.]])# 創(chuàng)建一維長(zhǎng)度為2,二維長(zhǎng)度為3的元素全為1的二維數(shù)組>>> arr5?=?np.ones((2,3))?>>>?arr5array([[?1.,??1.,??1.], [ 1., 1., 1.]])# 創(chuàng)建一維長(zhǎng)度為2,二維長(zhǎng)度為3的二維空數(shù)組>>> arr6 = np.empty([2,3]) >>> arr6array([[ 1., 1., 1.], [ 1., 1., 1.]]) # 從[0,1]區(qū)間的均勻分布隨機(jī)抽取四個(gè)數(shù)>>> arr7 = np.random.rand(4)>>> arr7array([ 0.36570416, 0.83097711, 0.98761922, 0.87057992])# 生成一個(gè)標(biāo)準(zhǔn)正態(tài)分布的4*4樣本值>>> arr8 = np.random.normal(size=(4,4)) >>>?arr8array([[-0.15990639, 0.7088309 , -0.20267733, 2.14992874], [ 0.05542048, -1.15103197, 0.21129526, 0.6212253 ], [-1.31547565, 1.4401065 , 0.6680733 , -0.60608497],???????[-1.03471769,??0.55338916,?-0.05869825,??0.61610795]])注意這里的?np.arange()?可以指定步長(zhǎng)為(0,1)為小數(shù),而Python內(nèi)置函數(shù)range無(wú)此功能。另外,np.random?中包括多種概率分布的隨機(jī)樣本,是數(shù)據(jù)分析輔助的重點(diǎn)工具之一。02
數(shù)組的切片與索引
數(shù)組的截取與 list 相同,可以通過(guò) []?來(lái)指定每個(gè)維度的索引。>>> import numpy as np>>> a = np.array([[1,2,3,4,5],[6,7,8,9,10]])>>> print(a)[[ 1 2 3 4 5] [ 6 7 8 9 10]]>>>?print(a[0:1])??#?截取第一行[[1 2 3 4 5]]>>>?print(a[1,2:5])?#?截取第二行,第三、四、五列[ 8 9 10]>>>?print(a[1:])?#?截取第二行[[?6??7??8??9?10]]另外,在應(yīng)用中經(jīng)常需要返回滿足給定條件的數(shù)組元素。為此,下面介紹一個(gè)按照條件索引的數(shù)組操作。>>> b = a[a>6] # 截取矩陣中大于6的元素,范圍是一維數(shù)組>>> print(b)[ 7 8 9 10]03
數(shù)組重組
數(shù)組重組主要是指對(duì)原來(lái)數(shù)組進(jìn)行修改,具體包括數(shù)組類型修改、數(shù)組維度修改與數(shù)組元素修改。>>>?#?數(shù)組元素的數(shù)據(jù)類型為字符串>>>?num_str1?=?np.array(['1.2','2.4','3.6'],dtype=np.string_)>>> # 利用astype轉(zhuǎn)換為浮點(diǎn)型>>>?num_str1.astype(float)array([ 1.2, 2.4, 3.6])>>> data = np.arange(6)>>> # 利用reshape 指定新數(shù)組各個(gè)維度>>> data = data.reshape(2,3) >>> dataarray([[0, 1, 2], [3, 4, 5]])>>> # data中小于3的元素用0代替,否則用1代替>>> np.where(data < 3,0,1) array([[0, 0, 0],???????[1,?1,?1]])這里?np.where(condition,x,y)函數(shù)是三元表達(dá)式:滿足條件(condition),輸出 x ,不滿足輸出 y 。04
?數(shù)組運(yùn)算
數(shù)學(xué)中的加減乘除運(yùn)算同樣也使用于數(shù)組。在數(shù)組中是按照元素級(jí)進(jìn)行批量運(yùn)算的,下面挑選幾個(gè)實(shí)例來(lái)說(shuō)明這一點(diǎn):>>> arr7 = np.array([[1,2,3],[4,5,6]])>>> arr7array([[1, 2, 3], [4, 5, 6]])>>>?arr7?*?2????#?數(shù)組的每個(gè)每個(gè)元素都乘以2array([[ 2, 4, 6], [ 8, 10, 12]])>>> arr7*arr7 # 兩個(gè)數(shù)組對(duì)應(yīng)的元素進(jìn)行運(yùn)算array([[ 1, 4, 9], [16, 25, 36]])>>> np.log(arr7) # 數(shù)組的每個(gè)元素都取 logarray([[ 0. , 0.69314718, 1.09861229], [ 1.38629436, 1.60943791, 1.79175947]])除了上述簡(jiǎn)單的元素級(jí)運(yùn)算,數(shù)組也可以進(jìn)行各種矩陣運(yùn)算,如矩陣向量的混合運(yùn)算、矩陣求逆、矩陣行列式、矩陣特征值。>>> A = np.array([[0,1],[2,3]])>>> Aarray([[0, 1], [2, 3]])>>> v = np.array([1,2])>>> varray([1,?2])>>>?v.dot(A)??#?dot是內(nèi)積運(yùn)算,運(yùn)算規(guī)則與線性代數(shù)相同array([4, 7])>>> A.dot(v) # 這里v看作列變量array([2,?8])Numpy 庫(kù)為Python中的數(shù)組運(yùn)算提供了很多便捷,這里只列舉了常用的少數(shù)幾個(gè)操作命令。其實(shí),Numpy可以看作計(jì)算科學(xué)的基礎(chǔ)模塊,而接下來(lái)介紹的pandas庫(kù)是在Numpy基礎(chǔ)上的拓展,也具備Numpy中的許多功能,而且不要求數(shù)據(jù)類型必須單一。pandas 簡(jiǎn)介
import pandas as pd
Pamdas是建立在 Numpy庫(kù)之上的,是使得數(shù)據(jù)分析工作變得更簡(jiǎn)單更快的高級(jí)操作工具。pandas的進(jìn)行數(shù)據(jù)處理主要針對(duì)兩種數(shù)據(jù)結(jié)構(gòu):Series 和 DataFrame 。Series
Series 是建立在 pandas 庫(kù)之上的,是使得數(shù)據(jù)分析工作變得更簡(jiǎn)單更快的高級(jí)操作工具。引入索引的一大作用是數(shù)據(jù)對(duì)其功能,使得進(jìn)行數(shù)據(jù)處理后不會(huì)發(fā)生數(shù)據(jù)錯(cuò)行。最簡(jiǎn)單的 Series 可以由一個(gè)列表類型的數(shù)據(jù)生成:>>> import pandas as pd>>> ser1 = pd.Series([1,3,5,7])>>> ser10 11 32 53 7dtype: int64Series的數(shù)據(jù)變現(xiàn)形式:索引在左側(cè),值在右邊,默認(rèn)的索引是從0開(kāi)始的整數(shù)型序列。我們也可以在創(chuàng)建的時(shí)候通過(guò) index 參數(shù)指定索引數(shù)據(jù)。>>> ser2 = pd.Series([1,3,5,7], index=['a','b','c','d'])>>> ser2a 1b 3c 5d 7dtype: int64在創(chuàng)建 Series 后可以對(duì)它們的一些屬性進(jìn)行修改,如下所示:>>> ser2.indexIndex(['a', 'b', 'c', 'd'], dtype='object')>>> ser2.index = ['A','B','C','D']>>> ser2A 1B 3C 5D 7dtype: int64對(duì) Series 中特定數(shù)據(jù)的查找,可以通過(guò)以下幾種方式來(lái)實(shí)現(xiàn):>>> ser2['A'] # 通過(guò)索引值查找值1>>> ser2[1] # 通過(guò)行號(hào)查找值3>>> ser2[0:2] # 通過(guò)切片來(lái)查找子序列A 1B 3dtype: int64在 Series 類型運(yùn)算中,輸出結(jié)果會(huì)自動(dòng)對(duì)齊不同索引的數(shù)據(jù)。當(dāng)序列中沒(méi)有共同的索引時(shí),則輸出缺失值符號(hào) NaN :>>> ser3 = pd.Series([1,3,5],index=['a','b','c'])>>> ser4 = pd.Series([2,4,6],index=['c','d','b'])>>> ser3 + ser4a NaNb 9.0c 7.0d NaNdtype: float64上述這種運(yùn)算機(jī)制在數(shù)據(jù)處理中非常有用,按照索引來(lái)進(jìn)行運(yùn)算可以避免錯(cuò)誤分行。總結(jié):Series 基本操作類似數(shù)組和字典,它們之間可以相互轉(zhuǎn)換。但是,序列是順序指定的、具有索引的數(shù)據(jù)類型。數(shù)組是沒(méi)有索引的,而字典的元素是無(wú)序的。Dataframe
DataFrame是將若干個(gè) Series 按列合并而成的二維數(shù)據(jù)結(jié)構(gòu),每一列單獨(dú)取出來(lái)就是一個(gè) Series 。數(shù)據(jù)框?DataFrame是用于存儲(chǔ)多行和多列的數(shù)據(jù)集合,是機(jī)器學(xué)習(xí)算法讀取數(shù)據(jù)的最常用格式。就像日常見(jiàn)到的二維 Excel 表格一樣,第一行默認(rèn)表示變量名,后續(xù)每行為一個(gè)樣本,而每列表示變量(特征)的取值。利用數(shù)據(jù)框之前需要導(dǎo)入處理數(shù)據(jù)的核心庫(kù) pandas 。下列幾行代碼基本包括了 DataFrame 的創(chuàng)建。>>> import pandas as pd # 導(dǎo)入 Python 庫(kù) pandas>>> dic1 = {"age":[18,20,22],"name":["xiaoming","wanghan","hanwei"],"Chinese":[90,78,97],"Math":[87,69,89],"English":[98,78,83],"History":[86,79,80],"Physics":[99,78,94]}>>> df = pd.DataFrame(dic1,index=['a','b','c'])>>> print(df) age name Chinese Math English History Physicsa 18 xiaoming 90 87 98 86 99b 20 wanghan 78 69 78 79 78c???22????hanwei???????97????89???????83???????80???????94從上面實(shí)例可以看出,數(shù)據(jù)框是由字典 data 直接轉(zhuǎn)化而來(lái)。實(shí)際數(shù)據(jù)分析中,采集到的數(shù)據(jù)結(jié)構(gòu)往往是多種類型的,而數(shù)據(jù)框恰好可以存放不同類型的數(shù)據(jù)。另外,利用 Python 讀取的數(shù)據(jù)往往自動(dòng)轉(zhuǎn)化為數(shù)據(jù)框類型的,如前面介紹的讀取本地?cái)?shù)據(jù)命令 pd.read_csv()?。01
?了解數(shù)據(jù)全貌
一旦把數(shù)據(jù)載入到 Python 中,首先要做的是了解數(shù)據(jù)的全貌與基本特征。例如,要知道數(shù)據(jù)框大小(行和列)、列變量名、索引號(hào)、數(shù)據(jù)類型等。如果想知道數(shù)據(jù)框的列變量與索引名稱,可以使用如下命令>>> print(df.columns) # 列變量名稱Index(['age', 'name', 'Chinese', 'Math', 'English', 'History', 'Physics'], dtype='object')>>> print(df.index) # 索引序列Index(['a', 'b', 'c'], dtype='object')>>> print(df.shape) # 行數(shù)與列數(shù)(3, 7)另外,Python 中存在一些內(nèi)置函數(shù)可以輸出許多數(shù)據(jù)框?qū)傩?#xff0c;例如:>>>?df.info()???#?整體匯總<class 'pandas.core.frame.DataFrame'>Index: 3 entries, a to cData columns (total 7 columns):age 3 non-null int64name 3 non-null objectChinese 3 non-null int64Math 3 non-null int64English 3 non-null int64History 3 non-null int64Physics 3 non-null int64dtypes: int64(6), object(1)memory usage: 168.0+ bytes>>>?df.describe()??#?對(duì)每一列數(shù)值型數(shù)據(jù)進(jìn)行統(tǒng)計(jì),包括計(jì)數(shù)、均值、標(biāo)準(zhǔn)差、標(biāo)準(zhǔn)差、各個(gè)分位數(shù)等 age Chinese ... History Physicscount 3.0 3.000000 ... 3.000000 3.000000mean 20.0 88.333333 ... 81.666667 90.333333std 2.0 9.609024 ... 3.785939 10.969655min 18.0 78.000000 ... 79.000000 78.00000025% 19.0 84.000000 ... 79.500000 86.00000050% 20.0 90.000000 ... 80.000000 94.00000075% 21.0 93.500000 ... 83.000000 96.500000max 22.0 97.000000 ... 86.000000 99.000000[8 rows x 6 columns]>>> df.describe(include=["object"]) # 基本統(tǒng)計(jì)描述(指定變量為類別型) namecount 3unique 3top wanghanfreq 102
?訪問(wèn)數(shù)據(jù)
訪問(wèn)數(shù)據(jù)框一列與若干列的常用的方法有如下兩種:>>> df["name"] # 按列變量訪問(wèn)a xiaomingb wanghanc hanweiName: name, dtype: object>>>?df.iloc[:,3]??#?按照列數(shù)訪問(wèn),這里表示第二列對(duì)應(yīng)的所有行a 87b 69c 89Name: Math, dtype: int64>>> df[["name","age","Math"]] # 指定列變量名 name age Matha xiaoming 18 87b wanghan 20 69c hanwei 22 89>>> df.iloc[:,:3] # 按照列數(shù)訪問(wèn),這里表示前兩列對(duì)應(yīng)所有行 age name Chinesea 18 xiaoming 90b 20 wanghan 78c 22 hanwei 97>>> df.head() # 默認(rèn)輸出前五行 age name Chinese Math English History Physicsa 18 xiaoming 90 87 98 86 99b 20 wanghan 78 69 78 79 78c 22 hanwei 97 89 83 80 94>>> df.tail() # 默認(rèn)輸出后五行 age name Chinese Math English History Physicsa 18 xiaoming 90 87 98 86 99b 20 wanghan 78 69 78 79 78c 22 hanwei 97 89 83 80 94類似的,訪問(wèn)數(shù)據(jù)框的行有如下幾種方法:>>> df[1:2] # 取第二行 age name Chinese Math English History Physicsb 20 wanghan 78 69 78 79 78>>> df.iloc[1,:] # 按照行數(shù)訪問(wèn),這里表示第二行對(duì)應(yīng)的所有列age 20name wanghanChinese 78Math 69English 78History 79Physics 78Name: b, dtype: object>>> df.iloc[0:2,] # 前兩行的所有列 age name Chinese Math English History Physicsa 18 xiaoming 90 87 98 86 99b 20 wanghan 78 69 78 79 78>>> df.iloc[1,1] # 第二行第二列'wanghan'03
?數(shù)字特征統(tǒng)計(jì)
既然數(shù)據(jù)框是個(gè)數(shù)據(jù)集合,那么我們經(jīng)常需要對(duì)其進(jìn)行一些基本統(tǒng)計(jì)描述。下面幾行代碼給出了常用的統(tǒng)計(jì)描述的操作:>>> print(df.mean()) # 默認(rèn)對(duì)數(shù)值型的所有列分布求平均age 20.000000Chinese 88.333333Math 81.666667English 86.333333History 81.666667Physics 90.333333dtype: float64>>> df.sum() # 列求和,方式類似 meanage 60name xiaomingwanghanhanweiChinese 265Math 245English 259History 245Physics 271dtype: object>>> df.max() # 求最大值,求最小值用 df.min()age 22name xiaomingChinese 97Math 89English 98History 86Physics 99dtype: object>>> df.isnull() # 布爾值輸出,檢查每列是否有缺失值 age name Chinese Math English History Physicsa False False False False False False Falseb False False False False False False Falsec False False False False False False False>>> df['age'].unique() # 該列不同值的個(gè)數(shù)array([18, 20, 22], dtype=int64)>>> df['age'].value_counts() # 統(tǒng)計(jì)某一列 'age' 中各個(gè)值出現(xiàn)的次數(shù)18 122 120 1Name:?age,?dtype:?int64總結(jié)
以上是生活随笔為你收集整理的python处理一亿条数据_Python基础数据处理库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: 检查用户名是否存在的servlet代码怎
 - 下一篇: 软件需求分析文档模板_小议管理软件需求分