日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

bootstraptable中responsehandle获取数据缺失_Python中的向量化字符串操作

發(fā)布時(shí)間:2024/9/27 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bootstraptable中responsehandle获取数据缺失_Python中的向量化字符串操作 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Python的一個(gè)使用優(yōu)勢(shì)是它在處理和操作字符串?dāng)?shù)據(jù)方面相對(duì)容易。

在此基礎(chǔ)上Pandas提供了一套全面的向量化字符串操作(vectorized string operation),這些操作成為處理現(xiàn)實(shí)世界數(shù)據(jù)時(shí)所需的必不可少的功能。

在本文中,我們將介紹一些Pandas的字符串操作,然后學(xué)習(xí)如何使用它們來(lái)部分清理從互聯(lián)網(wǎng)上收集的一個(gè)雜亂無(wú)章的食譜數(shù)據(jù)集進(jìn)行局部清洗。

Pandas字符串操作介紹

我們?cè)谇懊娴恼鹿?jié)中看到了像NumPy和Pandas這樣的工具是如何將算術(shù)運(yùn)算泛化的,這樣我們就可以輕松快速地對(duì)多個(gè)數(shù)組元素進(jìn)行相同的運(yùn)算。例如

這種向量化操作簡(jiǎn)化了對(duì)數(shù)據(jù)數(shù)組的操作語(yǔ)法:我們不再需要擔(dān)心數(shù)組的長(zhǎng)度或維度,而只需要擔(dān)心我們所需要的操作。

然而,對(duì)于字符串?dāng)?shù)組,NumPy并沒(méi)有提供這樣簡(jiǎn)單的接口訪問(wèn)方式。所以我們只能使用比較占內(nèi)存的for循環(huán)語(yǔ)法來(lái)解決問(wèn)題。

這也許足以有效應(yīng)付一些數(shù)據(jù),但如果數(shù)據(jù)中有任何缺失的值,那這樣就會(huì)引起異常。例如:

Pandas的str屬性堪稱兩全其美的方法。

它既可以做向量化的字符串操作的需求,也可以處理好缺失的數(shù)據(jù)。舉個(gè)例子,假設(shè)我們用這個(gè)數(shù)據(jù)創(chuàng)建一個(gè)Pandas Series:

現(xiàn)在我們可以調(diào)用轉(zhuǎn)換大寫方法capitalize( ),將所有字符串變成大寫,同時(shí)跳過(guò)缺失值:

在這個(gè)str屬性上使用tab鍵(基礎(chǔ)文章有概括如何使用tab鍵查看python方法)列出所有Pandas可用的向量化字符串方法

Pandas字符串方法列表

如果你對(duì)Python中的字符串操作很熟悉的話,那么就會(huì)發(fā)現(xiàn)Pandas絕大多數(shù)的字符串語(yǔ)法都是足夠直觀的,甚至可以列出一個(gè)可用的表格。從這里開(kāi)始,我們將使用以下一系列名稱來(lái)演示:

  • 與Python字符串方法相似的方法

幾乎所有Python內(nèi)置的字符串方法都被復(fù)制到Pandas的向量化字符串方法中。下面是一個(gè)Pandas的str方法鏡像Python字符串方法的列表:

需要注意的是,這些函數(shù)有不同的返回值,比如 lower( ) 方法返回一個(gè)字符串Series:

但還有些方法來(lái)返回?cái)?shù)值:

有些方法可以返回布爾值:

還有一些則返回每個(gè)元素的列表或其他復(fù)合值的方法:

我們將在接下來(lái)的討論中,進(jìn)一步來(lái)學(xué)習(xí)這類由列表元素構(gòu)成的Series (series-of-lists)對(duì)象。

  • 使用正則表達(dá)式的方法

此外,還有一些支持正則表達(dá)式的方法可以用來(lái)處理每個(gè)字符串元素。下面表中內(nèi)容是Pandas向量化字符串方法根據(jù)并遵循 Python標(biāo)準(zhǔn)庫(kù)的re模塊函數(shù)實(shí)現(xiàn)的API。

有了這些方法,你就可以進(jìn)行各種有趣的操作了。例如,我們可以通過(guò)提取每個(gè)元素的前面的一組連續(xù)的字符來(lái)作為每個(gè)人的名字(first name):

我們也可以實(shí)現(xiàn)一些更復(fù)雜的操作,比如找到所有以輔音開(kāi)頭和結(jié)尾的名字——這可以利用字符串開(kāi)始符號(hào)(^)和字符串結(jié)尾符號(hào)($)的正則表達(dá)式字符來(lái)實(shí)現(xiàn):

能夠?qū)⒄齽t表達(dá)式應(yīng)用到Series與DataFrame之中的話,就有可能實(shí)現(xiàn)更多的數(shù)據(jù)分析和清洗方法。

  • 其他字符串方法

還有其他一些方法也可以實(shí)現(xiàn)方便的操作,如下表所列:

  • 向量化字符串的取值與切片操作。

  • 需要特別指出的是,get( )和slice( )操作可以實(shí)現(xiàn)從每個(gè)字符串?dāng)?shù)組中獲取向量化元素。例如,我們可以使用str.slice(0, 3)來(lái)獲取每個(gè)字符串?dāng)?shù)組的前三個(gè)字符。通過(guò)Python的標(biāo)準(zhǔn)取值方法也可以取得同樣的效果,例如,

    df.str.slice(0,3)等價(jià)于df.str[0:3]:

    通過(guò)df.str.get(i)和df.str[i]進(jìn)行索引也有同樣類似的效果。

    get( )和slice( )的操作還可以讓你在split( )操作之后使用。例如,要提取每個(gè)名字的姓,我們可以結(jié)合使用split( )和get( ):

    ? ? ? ?2. 指標(biāo)變量

    另一個(gè)需要多花點(diǎn)時(shí)間額外解釋的是get_dummies()方法。當(dāng)你的數(shù)據(jù)中有一列包含了某種已被編碼的指標(biāo)(coded indicator)時(shí),這個(gè)方法就派上用處了。例如,我們有一個(gè)數(shù)據(jù)集,其中包含了某種編碼信息的數(shù)據(jù)集,如A="出生在美國(guó)",B="出生在英國(guó)",C="喜歡奶酪",D="喜歡垃圾郵件":

    get_dummies( )方法可以讓你快速將這些指標(biāo)變量拆分到DataFrame中。

    通過(guò)Pandas自帶的這些字符串操作方法,你可以建立一個(gè)功能強(qiáng)大的字符串處理程序來(lái)清理數(shù)據(jù)了。

    食譜數(shù)據(jù)庫(kù)的案例

    前面介紹的這些向量化字符串操作方法,在清理混亂的現(xiàn)實(shí)數(shù)據(jù)的過(guò)程中變得非常有用。

    下面我將通過(guò)一個(gè)從網(wǎng)絡(luò)上獲取的公開(kāi)食譜數(shù)據(jù)庫(kù)例子進(jìn)行講解。

    我們的目標(biāo)將是把這些食譜數(shù)據(jù)解析成配料表,這樣我們就可以根據(jù)我們手頭的一些配料來(lái)快速找到一個(gè)食譜了。

    獲取數(shù)據(jù)的原文件可以在 https://github.com/fictivekin/openrecipes 上找到,當(dāng)前最新版本的數(shù)據(jù)庫(kù)鏈接也可以在那里找到。

    截至2016年春季,這個(gè)數(shù)據(jù)庫(kù)大約有30MB,可以用這些命令下載并解壓:

    這個(gè)數(shù)據(jù)庫(kù)是JSON格式的,所以我們將嘗試通過(guò) pd.read_json 來(lái)讀取數(shù)據(jù):

    我們竟然得到了一個(gè)提示數(shù)據(jù)里有"trailing data"(數(shù)據(jù)斷行)的ValueError錯(cuò)誤。

    在CSDN上搜索這個(gè)錯(cuò)誤的含義,知道原因是由于使用了一個(gè)文件,其中每一行本身就是一個(gè)有效的JSON對(duì)象,但完整的文件卻不是這樣的。我們來(lái)看看這個(gè)解釋是否屬實(shí):

    顯然每一行都是一個(gè)有效的JSON,所以我們需要將這些字符串連接起來(lái)。我們可以做到這一點(diǎn)的一種方法是構(gòu)建一個(gè)包含所有這些JSON條目的字符串表示,然后再用 pd.read_json 來(lái)讀取所有數(shù)據(jù):

    我們看到有近20萬(wàn)個(gè)菜譜,還有17列。我們來(lái)抽一行看看具體內(nèi)容:

    這里有很多信息,而且其中很多信息都是以一種非?;靵y的形式存在,這是從網(wǎng)絡(luò)上抓取的典型數(shù)據(jù)。

    尤其是配料表是字符串格式的,我們要仔細(xì)提取我們感興趣的信息。

    我們先來(lái)仔細(xì)看看配料表:

    食材表平均長(zhǎng)250個(gè)字符,最短的字符串為0,最長(zhǎng)的竟然有近萬(wàn)個(gè)字符!

    出于好奇,我們來(lái)看看哪種配方的配料表最長(zhǎng):

    這看起來(lái)肯定是一個(gè)絕對(duì)復(fù)雜的食譜。

    我們還可以再做一些其他的探索;比如,我們看看有多少食譜是早餐類的:

    或者說(shuō)有多少食譜把肉桂(cinnamon)列為原料:

    我們甚至可以看看是否有食譜將原料拼錯(cuò)為 "cinamon":

    這是用Pandas字符串工具可以實(shí)現(xiàn)的基本數(shù)據(jù)探索類型。Python非常適合進(jìn)行類似的數(shù)據(jù)清理工作。

  • ?制作簡(jiǎn)單的美食推薦系統(tǒng)

  • 讓我們更進(jìn)一步,開(kāi)始研究一個(gè)簡(jiǎn)單的菜譜推薦系統(tǒng):給定一個(gè)食材清單,系統(tǒng)會(huì)推薦使用了所有這些食材的菜譜。

    雖然概念上很簡(jiǎn)單,但由于大量不規(guī)則數(shù)據(jù)(heterogeneity)的存在,這個(gè)任務(wù)變得很復(fù)雜:例如,并沒(méi)有一個(gè)簡(jiǎn)單直接的操作,可以從每一行中提取一個(gè)干凈的食材列表。

    因此,我們?cè)谶@里簡(jiǎn)單處理一下:

    首先,我們將從一個(gè)常見(jiàn)的成分列表開(kāi)始,通過(guò)簡(jiǎn)單搜索,來(lái)看看它們是否在每個(gè)食譜的成分列表中。

    為了簡(jiǎn)單起見(jiàn),我們暫且只說(shuō)香料和調(diào)味料:

    然后,我們可以建立一個(gè)由True和False值組成的布爾類型 DataFrame,來(lái)判斷這個(gè)原料是否出現(xiàn)在食譜列表中:

    現(xiàn)在,舉個(gè)例子,假設(shè)我們想找到一個(gè)使用歐芹parsley、辣椒粉paprika和龍蒿tarragon這三種食材的食譜。

    我們可以使用DataFrames的query( )方法來(lái)快速地計(jì)算出來(lái)。

    我們只找到了10個(gè)同時(shí)包含這個(gè)組合的菜譜,我們用這個(gè)選擇返回的索引來(lái)發(fā)現(xiàn)含有這個(gè)組合的菜譜名稱:

    現(xiàn)在,我們已經(jīng)將食譜選擇范圍縮小到了原來(lái)近2萬(wàn)份食譜的兩千分之一了,這樣就可以更明智地決定我們中意的食譜了。

    ? ? ?2. 繼續(xù)完善美食推薦系統(tǒng)

    希望這個(gè)例子能讓你對(duì)Pandas字符串方法可以高效解決哪些數(shù)據(jù)清問(wèn)題有個(gè)初步概念。

    當(dāng)然,如果要建立一個(gè)非常強(qiáng)大穩(wěn)定的菜譜推薦系統(tǒng),還需要更多大量的工作!

    從每個(gè)食譜中提取完整的配料表,將是一個(gè)這個(gè)任務(wù)的重中之重。

    不過(guò),由于使用的格式種類繁多,解析它們將是一個(gè)相對(duì)耗時(shí)的過(guò)程。

    這也說(shuō)明在數(shù)據(jù)分析中,對(duì)真實(shí)世界數(shù)據(jù)的清洗和整理工作往往會(huì)占據(jù)大部分的工作時(shí)間,而Pandas提供的工具可以幫助你高效地完成這項(xiàng)工作。

    持續(xù)關(guān)注我們,了解如何使用Pandas高效完成這些工作。

    總結(jié)

    以上是生活随笔為你收集整理的bootstraptable中responsehandle获取数据缺失_Python中的向量化字符串操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。