bootstraptable中responsehandle获取数据缺失_Python中的向量化字符串操作
Python的一個使用優勢是它在處理和操作字符串數據方面相對容易。
在此基礎上Pandas提供了一套全面的向量化字符串操作(vectorized string operation),這些操作成為處理現實世界數據時所需的必不可少的功能。
在本文中,我們將介紹一些Pandas的字符串操作,然后學習如何使用它們來部分清理從互聯網上收集的一個雜亂無章的食譜數據集進行局部清洗。
Pandas字符串操作介紹
我們在前面的章節中看到了像NumPy和Pandas這樣的工具是如何將算術運算泛化的,這樣我們就可以輕松快速地對多個數組元素進行相同的運算。例如
這種向量化操作簡化了對數據數組的操作語法:我們不再需要擔心數組的長度或維度,而只需要擔心我們所需要的操作。
然而,對于字符串數組,NumPy并沒有提供這樣簡單的接口訪問方式。所以我們只能使用比較占內存的for循環語法來解決問題。
這也許足以有效應付一些數據,但如果數據中有任何缺失的值,那這樣就會引起異常。例如:
Pandas的str屬性堪稱兩全其美的方法。
它既可以做向量化的字符串操作的需求,也可以處理好缺失的數據。舉個例子,假設我們用這個數據創建一個Pandas Series:
現在我們可以調用轉換大寫方法capitalize( ),將所有字符串變成大寫,同時跳過缺失值:
在這個str屬性上使用tab鍵(基礎文章有概括如何使用tab鍵查看python方法),將列出所有Pandas可用的向量化字符串方法。
Pandas字符串方法列表
如果你對Python中的字符串操作很熟悉的話,那么就會發現Pandas絕大多數的字符串語法都是足夠直觀的,甚至可以列出一個可用的表格。從這里開始,我們將使用以下一系列名稱來演示:
與Python字符串方法相似的方法
幾乎所有Python內置的字符串方法都被復制到Pandas的向量化字符串方法中。下面是一個Pandas的str方法鏡像Python字符串方法的列表:
需要注意的是,這些函數有不同的返回值,比如 lower( ) 方法返回一個字符串Series:
但還有些方法來返回數值:
有些方法可以返回布爾值:
還有一些則返回每個元素的列表或其他復合值的方法:
我們將在接下來的討論中,進一步來學習這類由列表元素構成的Series (series-of-lists)對象。
使用正則表達式的方法
此外,還有一些支持正則表達式的方法可以用來處理每個字符串元素。下面表中內容是Pandas向量化字符串方法根據并遵循 Python標準庫的re模塊函數實現的API。
有了這些方法,你就可以進行各種有趣的操作了。例如,我們可以通過提取每個元素的前面的一組連續的字符來作為每個人的名字(first name):
我們也可以實現一些更復雜的操作,比如找到所有以輔音開頭和結尾的名字——這可以利用字符串開始符號(^)和字符串結尾符號($)的正則表達式字符來實現:
能夠將正則表達式應用到Series與DataFrame之中的話,就有可能實現更多的數據分析和清洗方法。
其他字符串方法
還有其他一些方法也可以實現方便的操作,如下表所列:
向量化字符串的取值與切片操作。
需要特別指出的是,get( )和slice( )操作可以實現從每個字符串數組中獲取向量化元素。例如,我們可以使用str.slice(0, 3)來獲取每個字符串數組的前三個字符。通過Python的標準取值方法也可以取得同樣的效果,例如,
df.str.slice(0,3)等價于df.str[0:3]:
通過df.str.get(i)和df.str[i]進行索引也有同樣類似的效果。
get( )和slice( )的操作還可以讓你在split( )操作之后使用。例如,要提取每個名字的姓,我們可以結合使用split( )和get( ):
? ? ? ?2. 指標變量
另一個需要多花點時間額外解釋的是get_dummies()方法。當你的數據中有一列包含了某種已被編碼的指標(coded indicator)時,這個方法就派上用處了。例如,我們有一個數據集,其中包含了某種編碼信息的數據集,如A="出生在美國",B="出生在英國",C="喜歡奶酪",D="喜歡垃圾郵件":
get_dummies( )方法可以讓你快速將這些指標變量拆分到DataFrame中。
通過Pandas自帶的這些字符串操作方法,你可以建立一個功能強大的字符串處理程序來清理數據了。
食譜數據庫的案例
前面介紹的這些向量化字符串操作方法,在清理混亂的現實數據的過程中變得非常有用。
下面我將通過一個從網絡上獲取的公開食譜數據庫例子進行講解。
我們的目標將是把這些食譜數據解析成配料表,這樣我們就可以根據我們手頭的一些配料來快速找到一個食譜了。
獲取數據的原文件可以在 https://github.com/fictivekin/openrecipes 上找到,當前最新版本的數據庫鏈接也可以在那里找到。
截至2016年春季,這個數據庫大約有30MB,可以用這些命令下載并解壓:
這個數據庫是JSON格式的,所以我們將嘗試通過 pd.read_json 來讀取數據:
我們竟然得到了一個提示數據里有"trailing data"(數據斷行)的ValueError錯誤。
在CSDN上搜索這個錯誤的含義,知道原因是由于使用了一個文件,其中每一行本身就是一個有效的JSON對象,但完整的文件卻不是這樣的。我們來看看這個解釋是否屬實:
顯然每一行都是一個有效的JSON,所以我們需要將這些字符串連接起來。我們可以做到這一點的一種方法是構建一個包含所有這些JSON條目的字符串表示,然后再用 pd.read_json 來讀取所有數據:
我們看到有近20萬個菜譜,還有17列。我們來抽一行看看具體內容:
這里有很多信息,而且其中很多信息都是以一種非常混亂的形式存在,這是從網絡上抓取的典型數據。
尤其是配料表是字符串格式的,我們要仔細提取我們感興趣的信息。
我們先來仔細看看配料表:
食材表平均長250個字符,最短的字符串為0,最長的竟然有近萬個字符!
出于好奇,我們來看看哪種配方的配料表最長:
這看起來肯定是一個絕對復雜的食譜。
我們還可以再做一些其他的探索;比如,我們看看有多少食譜是早餐類的:
或者說有多少食譜把肉桂(cinnamon)列為原料:
我們甚至可以看看是否有食譜將原料拼錯為 "cinamon":
這是用Pandas字符串工具可以實現的基本數據探索類型。Python非常適合進行類似的數據清理工作。
?制作簡單的美食推薦系統
讓我們更進一步,開始研究一個簡單的菜譜推薦系統:給定一個食材清單,系統會推薦使用了所有這些食材的菜譜。
雖然概念上很簡單,但由于大量不規則數據(heterogeneity)的存在,這個任務變得很復雜:例如,并沒有一個簡單直接的操作,可以從每一行中提取一個干凈的食材列表。
因此,我們在這里簡單處理一下:
首先,我們將從一個常見的成分列表開始,通過簡單搜索,來看看它們是否在每個食譜的成分列表中。
為了簡單起見,我們暫且只說香料和調味料:
然后,我們可以建立一個由True和False值組成的布爾類型 DataFrame,來判斷這個原料是否出現在食譜列表中:
現在,舉個例子,假設我們想找到一個使用歐芹parsley、辣椒粉paprika和龍蒿tarragon這三種食材的食譜。
我們可以使用DataFrames的query( )方法來快速地計算出來。
我們只找到了10個同時包含這個組合的菜譜,我們用這個選擇返回的索引來發現含有這個組合的菜譜名稱:
現在,我們已經將食譜選擇范圍縮小到了原來近2萬份食譜的兩千分之一了,這樣就可以更明智地決定我們中意的食譜了。
? ? ?2. 繼續完善美食推薦系統
希望這個例子能讓你對Pandas字符串方法可以高效解決哪些數據清問題有個初步概念。
當然,如果要建立一個非常強大穩定的菜譜推薦系統,還需要更多大量的工作!
從每個食譜中提取完整的配料表,將是一個這個任務的重中之重。
不過,由于使用的格式種類繁多,解析它們將是一個相對耗時的過程。
這也說明在數據分析中,對真實世界數據的清洗和整理工作往往會占據大部分的工作時間,而Pandas提供的工具可以幫助你高效地完成這項工作。
持續關注我們,了解如何使用Pandas高效完成這些工作。
總結
以上是生活随笔為你收集整理的bootstraptable中responsehandle获取数据缺失_Python中的向量化字符串操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地暖机要怎么选?买哪家的地暖机比较好?
- 下一篇: python围棋程序在屏幕上找棋盘_用C