Python 數(shù)據(jù)處理(二十四)—— 索引和選擇
如果你想獲取 'A' 列的第 0 和第 2 個(gè)元素,你可以這樣做:
這也可以用 .iloc 獲取,通過(guò)使用位置索引來(lái)選擇內(nèi)容
可以使用 .get_indexer 獲取多個(gè)索引:
警告 :
對(duì)于包含一個(gè)或多個(gè)缺失標(biāo)簽的列表,使用 .loc 或 [] 將不再重新索引,而是使用 .reindex
在以前的版本中,只要索引列表中存在至少一個(gè)有效標(biāo)簽,就可以使用 .loc[list-of-labels]
但是現(xiàn)在,只要索引列表中存在缺失的標(biāo)簽將引發(fā) KeyError 。推薦的替代方法是使用 .reindex() 。
例如
索引列表的標(biāo)簽都存在
先前的版本
但是,現(xiàn)在
索引標(biāo)簽列表中包含不存在的標(biāo)簽,使用 reindex
另外,如果你只想選擇有效的鍵,可以使用下面的方法,同時(shí)保留了數(shù)據(jù)的 dtype
對(duì)于 .reindex() ,如果有重復(fù)的索引將會(huì)引發(fā)異常
通常,您可以將所需的標(biāo)簽與當(dāng)前軸做交集,然后重新索引
但是,如果你的索引結(jié)果包含重復(fù)標(biāo)簽,還是會(huì)引發(fā)異常
使用 sample() 方法可以從 Series 或 DataFrame 中隨機(jī)選擇行或列。
該方法默認(rèn)會(huì)對(duì)行進(jìn)行采樣,并接受一個(gè)特定的行數(shù)、列數(shù),或數(shù)據(jù)子集。
默認(rèn)情況下, sample 每行最多返回一次,但也可以使用 replace 參數(shù)進(jìn)行替換采樣
默認(rèn)情況下,每一行被選中的概率相等,但是如果你想讓每一行有不同的概率,你可以為 sample 函數(shù)的 weights 參數(shù)設(shè)置抽樣權(quán)值
這些權(quán)重可以是一個(gè)列表、一個(gè) NumPy 數(shù)組或一個(gè) Series ,但它們的長(zhǎng)度必須與你要抽樣的對(duì)象相同。
缺失的值將被視為權(quán)重為零,并且不允許使用 inf 值。如果權(quán)重之和不等于 1 ,則將所有權(quán)重除以權(quán)重之和,將其重新歸一化。例如
當(dāng)應(yīng)用于 DataFrame 時(shí),您可以通過(guò)簡(jiǎn)單地將列名作為字符串傳遞給 weights 作為采樣權(quán)重(前提是您要采樣的是行而不是列)。
sample 還允許用戶(hù)使用 axis 參數(shù)對(duì)列進(jìn)行抽樣。
最后,我們還可以使用 random_state 參數(shù)為 sample 的隨機(jī)數(shù)生成器設(shè)置一個(gè)種子,它將接受一個(gè)整數(shù)(作為種子)或一個(gè) NumPy RandomState 對(duì)象
當(dāng)為該軸設(shè)置一個(gè)不存在的鍵時(shí), .loc/[] 操作可以執(zhí)行放大
在 Series 的情況下,這實(shí)際上是一個(gè)追加操作
可以通過(guò) .loc 在任一軸上放大 DataFrame
這就像 DataFrame 的 append 操作
由于用 [] 做索引必須處理很多情況(單標(biāo)簽訪(fǎng)問(wèn)、分片、布爾索引等),所以需要一些開(kāi)銷(xiāo)來(lái)搞清楚你的意圖
如果你只想訪(fǎng)問(wèn)一個(gè)標(biāo)量值,最快的方法是使用 at 和 iat 方法,這兩個(gè)方法在所有的數(shù)據(jù)結(jié)構(gòu)上都實(shí)現(xiàn)了
與 loc 類(lèi)似, at 提供了基于標(biāo)簽的標(biāo)量查找,而 iat 提供了基于整數(shù)的查找,與 iloc 類(lèi)似
同時(shí),你也可以根據(jù)這些索引進(jìn)行設(shè)置值
如果索引標(biāo)簽不存在,會(huì)放大數(shù)據(jù)
另一種常見(jiàn)的操作是使用布爾向量來(lái)過(guò)濾數(shù)據(jù)。運(yùn)算符包括:
|(or) 、 &(and) 、 ~ (not)
這些必須用括號(hào)來(lái)分組,因?yàn)槟J(rèn)情況下, Python 會(huì)將 df['A'] > 2 & df['B'] < 3 這樣的表達(dá)式評(píng)估為 df['A'] > (2 & df['B']) < 3 ,而理想的執(zhí)行順序是 (df['A'] > 2) & (df['B'] < 3)
使用一個(gè)布爾向量來(lái)索引一個(gè) Series ,其工作原理和 NumPy ndarray 一樣。
您可以使用一個(gè)與 DataFrame 的索引長(zhǎng)度相同的布爾向量從 DataFrame 中選擇行
列表推導(dǎo)式和 Series 的 map 函數(shù)可用于產(chǎn)生更復(fù)雜的標(biāo)準(zhǔn)
我們可以使用布爾向量結(jié)合其他索引表達(dá)式,在多個(gè)軸上索引
iloc 支持兩種布爾索引。如果索引器是一個(gè)布爾值 Series ,就會(huì)引發(fā)異常。
例如,在下面的例子中, df.iloc[s.values, 1] 是正確的。但是 df.iloc[s,1] 會(huì)引發(fā) ValueError 。
相關(guān)評(píng)說(shuō):
茄子河區(qū)阿基: ______ spe = raw_input("input your order") n =0 with open("1.txt",r) as A: for eachline in A: tmp = eachline.rstrip().split("\t") if(tmp[2] == spe): n+=1 print n,tmp[5],tmp[1],"\n"差不多這意思?就是把第三列為某個(gè)分類(lèi)的物種全輸出來(lái).
茄子河區(qū)阿基: ______ 可以的,二進(jìn)制是計(jì)算機(jī)內(nèi)的表示方法,處理二進(jìn)制數(shù)據(jù)是最基本的能力.如果是二進(jìn)制字符串轉(zhuǎn)十進(jìn)制:>>> x = '10101010'>>> int(x, 2)170 如果是從文件或網(wǎng)絡(luò)中獲取的數(shù)據(jù),要知道某一位是0還是1的話(huà),獲取的數(shù)據(jù)可以按字符讀取,由于...
茄子河區(qū)阿基: ______ 如果你對(duì)這門(mén)語(yǔ)言還不太熟悉,你需要復(fù)習(xí)前面的內(nèi)容.假定我們現(xiàn)在已經(jīng)掌握了python語(yǔ)言的基本知識(shí),現(xiàn)在讓我們來(lái)使用python語(yǔ)言做一些更有意義的工作.幾個(gè)星期以前,我收到來(lái)自web站點(diǎn)發(fā)送的一封e-mail,通知我的網(wǎng)絡(luò)空...
茄子河區(qū)阿基: ______ 先嘗試優(yōu)化程序的時(shí)間復(fù)雜度,尋找更有效的算法 確保了算法復(fù)雜度在可接受范圍之內(nèi)后,開(kāi)始進(jìn)行常數(shù)優(yōu)化,以下是Python優(yōu)化的幾個(gè)小技巧:1. 實(shí)測(cè)表明,for語(yǔ)句一般比while語(yǔ)句效率更高2. 同樣實(shí)測(cè)表明,xrange一般比range要高效3. 如果要存儲(chǔ)動(dòng)態(tài)數(shù)據(jù)(即有可能頻繁變動(dòng)的數(shù)據(jù))少用list和str,多用dict4. 實(shí)測(cè)表明,兩個(gè)str的連接效率從高到低+=,join,+ 多個(gè)str的連接效率從高到低join,+=,+5. 盡可能使用列表解析表達(dá)式和生成器表達(dá)式代替循環(huán)一遍來(lái)構(gòu)建list6. 避免使用global關(guān)鍵字,無(wú)論是從代碼效率還是可移植性的方面考慮
茄子河區(qū)阿基: ______ import glob import os import re filelist = glob.glob('*.txt') p = re.compile(r'(.*)\|(.*)') for fn in filelist: try: fin = open(fn, 'r') fout = open('pro_' + os.path.split(fn)[1], 'w') except: print 'File open error!' os.exit(1) for line in fin.readlines(): if 'Rd' in line: line = p.sub...
茄子河區(qū)阿基: ______ Python的優(yōu)勢(shì)有必要作為第一步去了解,Python作為面向?qū)ο蟮哪_本語(yǔ)言,優(yōu)勢(shì)就是數(shù)據(jù)處理和挖掘,這也注定了它和AI、互聯(lián)網(wǎng)技術(shù)的緊密聯(lián)系.網(wǎng)站開(kāi)發(fā).Python數(shù)據(jù)處理很在線(xiàn),用它編寫(xiě)網(wǎng)站可以為大眾提供優(yōu)秀的服務(wù),主要使用django...
茄子河區(qū)阿基: ______ 什么是CSV 就是內(nèi)容用逗號(hào)隔開(kāi),后綴是'.csv'的文件.它可以被任何一個(gè)文本編輯器打開(kāi).如果用excel打開(kāi),它又可以是這樣的:END 讀CSV 典型的可處理的csv文件,通常含有表頭,也就是每列的列名.這樣一來(lái),每一行的內(nèi)容就可以...
茄子河區(qū)阿基: ______ >>> a = '46003,2013/11/02 15:21:56,/mmsns/M6CLCDD0GAysp3sbCxsCeKXxhDI4xHkt0sf8ick'>>> id, tm, addr = a.split(',', 2)>>> id, tm, addr('46003', '2013/11/02 15:21:56', '/mmsns/M6CLCDD0GAysp3sbCxsCeKXxhDI4xHkt0sf8ick')>>> a = '...
茄子河區(qū)阿基: ______ 并行讀取數(shù)據(jù)寫(xiě)入redis,然后從redis讀出來(lái)寫(xiě)入輸出文件.