Python中tail(2)的意思是
為蒼溪等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及蒼溪網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、蒼溪網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
在自然語(yǔ)言處理界,模式匹配可以說(shuō)是最常用的技術(shù)。甚至可以說(shuō),將NLP技術(shù)作為真實(shí)生產(chǎn)力的項(xiàng)目都少不了模式匹配。
什么是模式匹配呢?在計(jì)算機(jī)科學(xué)中,往往是檢查給定的序列或字符串中是否有符合某種模式的片段。比如說(shuō):“啊,你的AK-47打得真準(zhǔn)”,如果我們將 “啊,你的_____打得真準(zhǔn) ” 作為一種模式,則會(huì)將AK-47匹配出來(lái)。
實(shí)現(xiàn)模式匹配往往都是用正則表達(dá)式,但是如果你想識(shí)別特別復(fù)雜的模式,編寫(xiě)正則表達(dá)式就會(huì)變得非常非常麻煩。而Pampy這個(gè)項(xiàng)目能解決你不少的煩惱。
python不能無(wú)限的遞歸調(diào)用下去。并且當(dāng)輸入的值太大,遞歸次數(shù)太多時(shí),python 都會(huì)報(bào)錯(cuò)
首先說(shuō)結(jié)論,python解釋器這么會(huì)限制遞歸次數(shù),這么做為了避免"無(wú)限"調(diào)用導(dǎo)致的堆棧溢出。
tail recursion 就是指在程序最后一步執(zhí)行遞歸。這種函數(shù)稱(chēng)為 tail recursion function。舉個(gè)例子:
這個(gè)函數(shù)就是普通的遞歸函數(shù),它在遞歸之后又進(jìn)行了 乘 的操作。 這種普通遞歸,每一次遞歸調(diào)用都會(huì)重新推入一個(gè)調(diào)用堆棧。
把上述調(diào)用改成 tail recursion function
tail recursion 的好處是每一次都計(jì)算完,將結(jié)果傳遞給下一次調(diào)用,然后本次調(diào)用任務(wù)就結(jié)束了,不會(huì)參與到下一次的遞歸調(diào)用。這種情況下,只重復(fù)用到了一個(gè)堆棧。因此可以?xún)?yōu)化結(jié)構(gòu)。就算是多次循環(huán),也不會(huì)出現(xiàn)棧溢出的情況。這就是 tail recursion optimization 。
c和c++都有這種優(yōu)化, python沒(méi)有,所以限制了調(diào)用次數(shù),就是為了防止無(wú)限遞歸造成的棧溢出。
如果遞歸次數(shù)過(guò)多,導(dǎo)致了開(kāi)頭的報(bào)錯(cuò),可以使用 sys 包手動(dòng)設(shè)置recursion的limit
手動(dòng)放大 recursionlimit 限制:
List(列表) 是 Python 中使用最頻繁的數(shù)據(jù)類(lèi)型。
列表可以完成大多數(shù)集合類(lèi)的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。它支持字符,數(shù)字,字符串甚至可以包含列表(即嵌套)。
列表用 [ ] 標(biāo)識(shí),是 python 最通用的復(fù)合數(shù)據(jù)類(lèi)型。
列表中值的切割也可以用到變量 [頭下標(biāo):尾下標(biāo)] ,就可以截取相應(yīng)的列表,從左到右索引默認(rèn) 0 開(kāi)始,從右到左索引默認(rèn) -1 開(kāi)始,下標(biāo)可以為空表示取到頭或尾。
list() 方法用于將元組轉(zhuǎn)換為列表。
注:元組與列表是非常類(lèi)似的,區(qū)別在于元組的元素值不能修改,元組是放在括號(hào)中,列表是放于方括號(hào)中。
第一部分是生成數(shù)據(jù)表,常見(jiàn)的生成方法有兩種,第一種是導(dǎo)入外部數(shù)據(jù),第二種是直接寫(xiě)入數(shù)據(jù)。 Excel 中的文件菜單中提供了獲取外部數(shù)據(jù)的功能,支持?jǐn)?shù)據(jù)庫(kù)和文本文件和頁(yè)面的多種數(shù)據(jù)源導(dǎo)入。
獲取外部數(shù)據(jù)
python 支持從多種類(lèi)型的數(shù)據(jù)導(dǎo)入。在開(kāi)始使用 python 進(jìn)行數(shù)據(jù)導(dǎo)入前需要先導(dǎo)入 pandas 庫(kù),為了方便起見(jiàn),我們也同時(shí)導(dǎo)入 numpy 庫(kù)。
1 import numpy as np
2 import pandas as pd
導(dǎo)入數(shù)據(jù)表
下面分別是從 excel 和 csv 格式文件導(dǎo)入數(shù)據(jù)并創(chuàng)建數(shù)據(jù)表的方法。代碼是最簡(jiǎn)模式,里面有很多可選參數(shù)設(shè)置,例如列名稱(chēng),索引列,數(shù)據(jù)格式等等。感興趣的朋友可以參考 pandas 的
官方文檔。
1 df=pd.DataFrame(pd.read_csv(‘name.csv’,header=1))
2 df=pd.DataFrame(pd.read_excel(‘name.xlsx’))
創(chuàng)建數(shù)據(jù)表
另一種方法是通過(guò)直接寫(xiě)入數(shù)據(jù)來(lái)生成數(shù)據(jù)表,excel 中直接在單元格中輸入數(shù)據(jù)就可以,python 中通過(guò)下面的代碼來(lái)實(shí)現(xiàn)。生成數(shù)據(jù)表的函數(shù)是 pandas 庫(kù)中的 DateFrame 函數(shù),數(shù)據(jù)表一共有 6 行數(shù)據(jù),每行有 6 個(gè)字段。在數(shù)據(jù)中我們特意設(shè)置了一些 NA 值和有問(wèn)題的字段,例如包含空格等。后面將在數(shù)據(jù)清洗步驟進(jìn)行處理。后面我們將統(tǒng)一以 DataFrame 的簡(jiǎn)稱(chēng) df 來(lái)命名數(shù)據(jù)表。
1 df = pd.DataFrame({‘id’:[1001,1002,1003,1004,1005,1006],
2 ‘date’:pd.date_range(‘20130102’, periods=6),
3 ‘city’:['Beijing ', ‘SH’, ’ guangzhou ', ‘Shenzhen’, ‘shanghai’, 'BEIJING '],
4 ‘a(chǎn)ge’:[23,44,54,32,34,32],
5 ‘category’:[‘100-A’,‘100-B’,‘110-A’,‘110-C’,‘210-A’,‘130-F’],
6 ‘price’:[1200,np.nan,2133,5433,np.nan,4432]},
7 columns =[‘id’,‘date’,‘city’,‘category’,‘a(chǎn)ge’,‘price’])
這是剛剛創(chuàng)建的數(shù)據(jù)表,我們沒(méi)有設(shè)置索引列,price 字段中包含有 NA 值,city 字段中還包含了一些臟數(shù)據(jù)。
數(shù)據(jù)表檢查
python 中處理的數(shù)據(jù)量通常會(huì)比較大,所以就需要我們對(duì)數(shù)據(jù)表進(jìn)行檢查。比如我們之前的文章中介紹的紐約出租車(chē)數(shù)據(jù)和 Citibike 的騎行數(shù)據(jù),數(shù)據(jù)量都在千萬(wàn)級(jí),我們無(wú)法一目了然的了解數(shù)據(jù)表的整體情況,必須要通過(guò)一些方法來(lái)獲得數(shù)據(jù)表的關(guān)鍵信息。數(shù)據(jù)表檢查的另一個(gè)目的是了解數(shù)據(jù)的概況,例如整個(gè)數(shù)據(jù)表的大小,所占空間,數(shù)據(jù)格式,是否有空值和重復(fù)項(xiàng)和具體的數(shù)據(jù)內(nèi)容。為后面的清洗和預(yù)處理做好準(zhǔn)備。
數(shù)據(jù)維度(行列)
Excel 中可以通過(guò) CTRL 向下的光標(biāo)鍵,和 CTRL 向右的光標(biāo)鍵來(lái)查看行號(hào)和列號(hào)。Python 中使用 shape 函數(shù)來(lái)查看數(shù)據(jù)表的維度,也就是行數(shù)和列數(shù),函數(shù)返回的結(jié)果(6,6)表示數(shù)據(jù)表有 6 行,6 列。下面是具體的代碼。
1 #查看數(shù)據(jù)表的維度
2 df.shape
3 (6, 6)
數(shù)據(jù)表信息
使用 info 函數(shù)查看數(shù)據(jù)表的整體信息,這里返回的信息比較多,包括數(shù)據(jù)維度,列名稱(chēng),數(shù)據(jù)格式和所占空間等信息。
1 #數(shù)據(jù)表信息
2 df.info()
4 class ‘pandas.core.frame.DataFrame’
5 RangeIndex: 6 entries, 0 to 5
6 Data columns (total 6 columns):
7 id 6 non-null int64
8 date 6 non-null datetime64[ns]
9 city 6 non-null object
10 category 6 non-null object
11 age 6 non-null int64
12 price 4 non-null float64
13 dtypes: datetime64ns, float64(1), int64(2), object(2)
14 memory usage: 368.0 bytes
查看數(shù)據(jù)格式
Excel 中通過(guò)選中單元格并查看開(kāi)始菜單中的數(shù)值類(lèi)型來(lái)判斷數(shù)據(jù)的格式。Python 中使用 dtypes 函數(shù)來(lái)返回?cái)?shù)據(jù)格式。
Dtypes 是一個(gè)查看數(shù)據(jù)格式的函數(shù),可以一次性查看數(shù)據(jù)表中所有數(shù)據(jù)的格式,也可以指定一列來(lái)單獨(dú)查看。
1#查看數(shù)據(jù)表各列格式
2df.dtypes
3
4id int64
5date datetime64[ns]
6city object
7category object
8age int64
9price float64
10dtype: object
11
12#查看單列格式
13df[‘B’].dtype
14
15dtype(‘int64’)
查看空值
Excel 中查看空值的方法是使用“定位條件”功能對(duì)數(shù)據(jù)表中的空值進(jìn)行定位。“定位條件”在“開(kāi)始”目錄下的“查找和選擇”目錄中。
Isnull 是 Python 中檢驗(yàn)空值的函數(shù),返回的結(jié)果是邏輯值,包含空值返回 True,不包含則返回 False??梢詫?duì)整個(gè)數(shù)據(jù)表進(jìn)行檢查,也可以單獨(dú)對(duì)某一列進(jìn)行空值檢查。
df_isnull
1#檢查特定列空值
2df[‘price’].isnull()
3
40 False
51 True
62 False
73 False
84 True
95 False
10Name: price, dtype: bool
查看唯一值
Excel 中查看唯一值的方法是使用“條件格式”對(duì)唯一值進(jìn)行顏色標(biāo)記。Python 中使用 unique 函數(shù)查看唯一值。
Unique 是查看唯一值的函數(shù),只能對(duì)數(shù)據(jù)表中的特定列進(jìn)行檢查。下面是代碼,返回的結(jié)果是該列中的唯一值。類(lèi)似與 Excel 中刪除重復(fù)項(xiàng)后的結(jié)果。
1 #查看 city 列中的唯一值
2 df[‘city’].unique()34array(['Beijing ', ‘SH’, ’ guangzhou ', ‘Shenzhen’, ‘shanghai’, 'BEIJING '], dtype=object)
查看數(shù)據(jù)表數(shù)值
Python 中的 Values 函數(shù)用來(lái)查看數(shù)據(jù)表中的數(shù)值。以數(shù)組的形式返回,不包含表頭信息。
1#查看數(shù)據(jù)表的值
2df.values
3
4array([[1001, Timestamp(‘2013-01-02 00:00:00’), 'Beijing ', ‘100-A’, 23,
5 1200.0],
6 [1002, Timestamp(‘2013-01-03 00:00:00’), ‘SH’, ‘100-B’, 44, nan],
7 [1003, Timestamp(‘2013-01-04 00:00:00’), ’ guangzhou ', ‘110-A’, 54,
8 2133.0],
9 [1004, Timestamp(‘2013-01-05 00:00:00’), ‘Shenzhen’, ‘110-C’, 32,
10 5433.0],
11 [1005, Timestamp(‘2013-01-06 00:00:00’), ‘shanghai’, ‘210-A’, 34,
12 nan],
13 [1006, Timestamp(‘2013-01-07 00:00:00’), 'BEIJING ', ‘130-F’, 32,
14 4432.0]], dtype=object)
查看列名稱(chēng)
Colums 函數(shù)用來(lái)單獨(dú)查看數(shù)據(jù)表中的列名稱(chēng)。
1 #查看列名稱(chēng)
2 df.columns
3
4 Index([‘id’, ‘date’, ‘city’, ‘category’, ‘a(chǎn)ge’, ‘price’], dtype=‘object’)
查看前 10 行數(shù)據(jù)
Head 函數(shù)用來(lái)查看數(shù)據(jù)表中的前 N 行數(shù)據(jù),默認(rèn) head()顯示前 10 行數(shù)據(jù),可以自己設(shè)置參數(shù)值來(lái)確定查看的行數(shù)。下面的代碼中設(shè)置查看前 3 行的數(shù)據(jù)。
1#查看前 3 行數(shù)據(jù)``df.head(``3``)
Tail 行數(shù)與 head 函數(shù)相反,用來(lái)查看數(shù)據(jù)表中后 N 行的數(shù)據(jù),默認(rèn) tail()顯示后 10 行數(shù)據(jù),可以自己設(shè)置參數(shù)值來(lái)確定查看的行數(shù)。下面的代碼中設(shè)置查看后 3 行的數(shù)據(jù)。
1#查看最后 3 行df.tail(3)
pandas包最基本的功能
1、讀取數(shù)據(jù):
data = pd.read_csv('my_file.csv')
data=pd.read_csv('my_file.csv',sep=';',encoding='latin-1',nrows=1000, kiprows=[2,5])
sep變量代表分隔符。因?yàn)镋xcel中的csv分隔符是“;”,因此需要顯示它。編碼設(shè)置為“l(fā)atin-1”以讀取法語(yǔ)字符。nrows=1000表示讀取前1000行。skiprows=[2,5]表示在讀取文件時(shí)將刪除第2行和第5行
最常用的函數(shù):read_csv, read_excel
還有一些很不錯(cuò)的函數(shù):read_clipboard、read_sql
2、寫(xiě)入數(shù)據(jù)
data.to_csv('my_new_file.csv', index=None)
index=None將簡(jiǎn)單地按原樣寫(xiě)入數(shù)據(jù)。如果你不寫(xiě)index=None,會(huì)得到額外的行。
我通常不使用其他函數(shù),比如to_excel,to_json,to_pickle,to_csv,雖然它們也做得很好,但是csv是保存表最常用的方法。
3、檢查數(shù)據(jù):
data.shape
data.describe()
data.head(3)
.head(3)打印數(shù)據(jù)的前3行,.tail()函數(shù)將查看數(shù)據(jù)的最后一行。
data.loc[8]
打印第8行。
data.loc[8, 'column_1']
將第8行值打印在“column_1”上。
data.loc[range(4,6)]
打印第4行到第6行。