摘要:在這個教程中,我們將利用的和包來進行數據清洗。在很多情況下,使用唯一的值作為索引值識別數據字段是非常有幫助的。清洗數據字段到現在為止,我們移除了不必要的列并改變了我們的索引變得更有意義。
作者:xiaoyu
微信公眾號:Python數據科學
知乎:Python數據分析師
數據科學家花了大量的時間清洗數據集,并將這些數據轉換為他們可以處理的格式。事實上,很多數據科學家聲稱開始獲取和清洗數據的工作量要占整個工作的80%。
因此,如果你正巧也在這個領域中,或者計劃進入這個領域,那么處理這些雜亂不規則數據是非常重要的,這些雜亂數據包括一些缺失值,不連續格式,錯誤記錄,或者是沒有意義的異常值。
在這個教程中,我們將利用Python的Pandas和Numpy包來進行數據清洗。
主要內容如下:
刪除 DataFrame 中的不必要 columns
改變 DataFrame 的 index
使用 .str() 方法來清洗 columns
使用 DataFrame.applymap() 函數按元素的清洗整個數據集
重命名 columns 為一組更易識別的標簽
濾除 CSV文件中不必要的 rows
下面是要用到的數據集:
BL-Flickr-Images-Book.csv - 一份來自英國圖書館包含關于書籍信息的CSV文檔
university_towns.txt - 一份包含美國各大洲大學城名稱的text文檔
olympics.csv - 一份總結了各國家參加夏季與冬季奧林匹克運動會情況的CSV文檔
你可以從Real Python 的 GitHub repository 下載數據集來進行下面的例子。
注意:建議使用Jupter Notebooks來學習下面的知識。
學習之前假設你已經有了對Pandas和Numpy庫的基本認識,包括Pandas的工作基礎Series和DataFrame對象,應用到這些對象上的常用方法,以及熟悉了NumPy的NaN值。
讓我們導入這些模塊開始我們的學習。
>>> import pandas as pd >>> import numpy as np刪除DataFrame的列
經常的,你會發現數據集中不是所有的字段類型都是有用的。例如,你可能有一個關于學生信息的數據集,包含姓名,分數,標準,父母姓名,住址等具體信息,但是你只想分析學生的分數。
這個情況下,住址或者父母姓名信息對你來說就不是很重要。這些沒有用的信息會占用不必要的空間,并會使運行時間減慢。
Pandas提供了一個非常便捷的方法drop()函數來移除一個DataFrame中不想要的行或列。讓我們看一個簡單的例子如何從DataFrame中移除列。
首先,我們引入BL-Flickr-Images-Book.csv文件,并創建一個此文件的DataFrame。在下面這個例子中,我們設置了一個pd.read_csv的相對路徑,意味著所有的數據集都在Datasets文件夾下的當前工作目錄中:
>>> df = pd.read_csv("Datasets/BL-Flickr-Images-Book.csv") >>> df.head() Identifier Edition Statement Place of Publication 0 206 NaN London 1 216 NaN London; Virtue & Yorston 2 218 NaN London 3 472 NaN London 4 480 A new edition, revised, etc. London Date of Publication Publisher 0 1879 [1878] S. Tinsley & Co. 1 1868 Virtue & Co. 2 1869 Bradbury, Evans & Co. 3 1851 James Darling 4 1857 Wertheim & Macintosh Title Author 0 Walter Forbes. [A novel.] By A. A A. A. 1 All for Greed. [A novel. The dedication signed... A., A. A. 2 Love the Avenger. By the author of “All for Gr... A., A. A. 3 Welsh Sketches, chiefly ecclesiastical, to the... A., E. S. 4 [The World in which I live, and my place in it... A., E. S. Contributors Corporate Author 0 FORBES, Walter. NaN 1 BLAZE DE BURY, Marie Pauline Rose - Baroness NaN 2 BLAZE DE BURY, Marie Pauline Rose - Baroness NaN 3 Appleyard, Ernest Silvanus. NaN 4 BROOME, John Henry. NaN Corporate Contributors Former owner Engraver Issuance type 0 NaN NaN NaN monographic 1 NaN NaN NaN monographic 2 NaN NaN NaN monographic 3 NaN NaN NaN monographic 4 NaN NaN NaN monographic Flickr URL 0 http://www.flickr.com/photos/britishlibrary/ta... 1 http://www.flickr.com/photos/britishlibrary/ta... 2 http://www.flickr.com/photos/britishlibrary/ta... 3 http://www.flickr.com/photos/britishlibrary/ta... 4 http://www.flickr.com/photos/britishlibrary/ta... Shelfmarks 0 British Library HMNTS 12641.b.30. 1 British Library HMNTS 12626.cc.2. 2 British Library HMNTS 12625.dd.1. 3 British Library HMNTS 10369.bbb.15. 4 British Library HMNTS 9007.d.28.
我們使用了head()方法得到了前五個行信息,這些列提供了對圖書館有幫助的輔助信息,但是并不能很好的描述這些書籍:Edition Statement, Corporate Author, Corporate Contributors, Former owner, Engraver, Issuance type and Shelfmarks。
因此,我們可以用下面的方法移除這些列:
>>> to_drop = ["Edition Statement", ... "Corporate Author", ... "Corporate Contributors", ... "Former owner", ... "Engraver", ... "Contributors", ... "Issuance type", ... "Shelfmarks"] >>> df.drop(to_drop, inplace=True, axis=1)
在上面,我們定義了一個包含我們不要的列的名稱列表。接著,我們在對象上調用drop()函數,其中inplace參數是True,axis參數是1。這告訴了Pandas我們想要直接在我們的對象上發生改變,并且它應該可以尋找對象中被移除列的信息。
我們再次看一下DataFrame,我們會看到不要想的信息已經被移除了。
>>> df.head() Identifier Place of Publication Date of Publication 0 206 London 1879 [1878] 1 216 London; Virtue & Yorston 1868 2 218 London 1869 3 472 London 1851 4 480 London 1857 Publisher Title 0 S. Tinsley & Co. Walter Forbes. [A novel.] By A. A 1 Virtue & Co. All for Greed. [A novel. The dedication signed... 2 Bradbury, Evans & Co. Love the Avenger. By the author of “All for Gr... 3 James Darling Welsh Sketches, chiefly ecclesiastical, to the... 4 Wertheim & Macintosh [The World in which I live, and my place in it... Author Flickr URL 0 A. A. http://www.flickr.com/photos/britishlibrary/ta... 1 A., A. A. http://www.flickr.com/photos/britishlibrary/ta... 2 A., A. A. http://www.flickr.com/photos/britishlibrary/ta... 3 A., E. S. http://www.flickr.com/photos/britishlibrary/ta... 4 A., E. S. http://www.flickr.com/photos/britishlibrary/ta...
同樣的,我們也可以通過給columns參數賦值直接移除列,而就不用分別定義to_drop列表和axis了。
>>> df.drop(columns=to_drop, inplace=True)
這種語法更直觀更可讀。我們這里將要做什么就很明顯了。
改變DataFrame的索引Pandas索引index擴展了Numpy數組的功能,以允許更多多樣化的切分和標記。在很多情況下,使用唯一的值作為索引值識別數據字段是非常有幫助的。
例如,仍然使用上一節的數據集,可以想象當一個圖書管理員尋找一個記錄,他們也許會輸入一個唯一標識來定位一本書。
>>> df["Identifier"].is_unique True
讓我們用set_index把已經存在的索引改為這個列。
>>> df = df.set_index("Identifier") >>> df.head() Place of Publication Date of Publication 206 London 1879 [1878] 216 London; Virtue & Yorston 1868 218 London 1869 472 London 1851 480 London 1857 Publisher 206 S. Tinsley & Co. 216 Virtue & Co. 218 Bradbury, Evans & Co. 472 James Darling 480 Wertheim & Macintosh Title Author 206 Walter Forbes. [A novel.] By A. A A. A. 216 All for Greed. [A novel. The dedication signed... A., A. A. 218 Love the Avenger. By the author of “All for Gr... A., A. A. 472 Welsh Sketches, chiefly ecclesiastical, to the... A., E. S. 480 [The World in which I live, and my place in it... A., E. S. Flickr URL 206 http://www.flickr.com/photos/britishlibrary/ta... 216 http://www.flickr.com/photos/britishlibrary/ta... 218 http://www.flickr.com/photos/britishlibrary/ta... 472 http://www.flickr.com/photos/britishlibrary/ta... 480 http://www.flickr.com/photos/britishlibrary/ta...
技術細節:不像在SQL中的主鍵一樣,pandas的索引不保證唯一性,盡管許多索引和合并操作將會使運行時間變長如果是這樣。
我們可以用一個直接的方法loc[]來獲取每一條記錄。盡管loc[]這個詞可能看上去沒有那么直觀,但它允許我們使用基于標簽的索引,這個索引是行的標簽或者不考慮位置的記錄。
>>> df.loc[206] Place of Publication London Date of Publication 1879 [1878] Publisher S. Tinsley & Co. Title Walter Forbes. [A novel.] By A. A Author A. A. Flickr URL http://www.flickr.com/photos/britishlibrary/ta... Name: 206, dtype: object
換句話說,206是索引的第一個標簽。如果想通過位置獲取它,我們可以使用df.iloc[0],是一個基于位置的索引。
之前,我們的索引是一個范圍索引:從0開始的整數,類似Python的內建range。通過給set_index一個列名,我們就把索引變成了Identifier中的值。
你也許注意到了我們通過df = df.set_index(...)的返回變量重新給對象賦了值。這是因為,默認的情況下,這個方法返回一個被改變對象的拷貝,并且它不會直接對原對象做任何改變。我們可以通過設置參數inplace來避免這個問題。
df.set_index("Identifier", inplace=True)清洗數據字段
到現在為止,我們移除了不必要的列并改變了我們的索引變得更有意義。這個部分,我們將清洗特殊的列,并使它們變成統一的格式,這樣可以更好的理解數據集和加強連續性。特別的,我們將清洗Date of Publication和Place of Publication。
根據上面觀察,所有的數據類型都是現在的objectdtype類型,差不多類似于Python中的str。
它包含了一些不能被適用于數值或是分類的數據。這也正常,因為我們正在處理這些初始值就是雜亂無章字符串的數據。
>>> df.get_dtype_counts() object 6
一個需要被改變為數值的的字段是the date of publication所以我們做如下操作:
>>> df.loc[1905:, "Date of Publication"].head(10) Identifier 1905 1888 1929 1839, 38-54 2836 [1897?] 2854 1865 2956 1860-63 2957 1873 3017 1866 3131 1899 4598 1814 4884 1820 Name: Date of Publication, dtype: object
一本書只能有一個出版日期data of publication。因此,我們需要做以下的一些事情:
移除在方括號內的額外日期,任何存在的:1879[1878]。
將日期范圍轉化為它們的起始日期,任何存在的:1860-63;1839,38-54。
完全移除我們不關心的日期,并用Numpy的NaN替換:[1879?]。
將字符串nan轉化為Numpy的NaN值。
考慮這些模式,我們可以用一個簡單的正則表達式來提取出版日期:
regex = r"^(d{4})"
上面正則表達式的意思在字符串開頭尋找任何四位數字,符合我們的情況。
d代表任何數字,{4}重復這個規則四次。^符號匹配一個字符串最開始的部分,圓括號表示一個分組,提示pandas我們想要提取正則表達式的部分。
讓我們看看運行這個正則在數據集上之后會發生什么。
>>> extr = df["Date of Publication"].str.extract(r"^(d{4})", expand=False) >>> extr.head() Identifier 206 1879 216 1868 218 1869 472 1851 480 1857 Name: Date of Publication, dtype: object
其實這個列仍然是一個object類型,但是我們可以使用pd.to_numeric輕松的得到數字的版本:
>>> df["Date of Publication"] = pd.to_numeric(extr) >>> df["Date of Publication"].dtype dtype("float64")
這個結果中,10個值里大約有1個值缺失,這讓我們付出了很小的代價來對剩余有效的值做計算。
>>> df["Date of Publication"].isnull().sum() / len(df) 0.11717147339205986結合str方法與Numpy清洗列
上面,你可以觀察到df["Date of Publication"].str. 的使用。這個屬性是pandas里的一種提升字符串操作速度的方法,并有大量的Python字符串或編譯的正則表達式上的小操作,例如.split(),.replace(),和.capitalize()。
為了清洗Place of Publication字段,我們可以結合pandas的str方法和numpy的np.where函數配合完成。
它的語法如下:
>>> np.where(condition, then, else)
這里,condition可以使一個類數組的對象,也可以是一個布爾表達。如果condition值為真,那么then將被使用,否則使用else。
它也可以組網使用,允許我們基于多個條件進行計算。
>>> np.where(condition1, x1, np.where(condition2, x2, np.where(condition3, x3, ...)))
我們將使用這兩個方程來清洗Place of Publication由于這列有字符串對象。以下是這個列的內容:
>>> df["Place of Publication"].head(10) Identifier 206 London 216 London; Virtue & Yorston 218 London 472 London 480 London 481 London 519 London 667 pp. 40. G. Bryan & Co: Oxford, 1898 874 London] 1143 London Name: Place of Publication, dtype: object
我們看到,對于一些行,place of publication還被一些其它沒有用的信息圍繞著。如果我們看更多的值,我們發現這種情況中有些行
讓我們看看兩個特殊的:
>>> df.loc[4157862] Place of Publication Newcastle-upon-Tyne Date of Publication 1867 Publisher T. Fordyce Title Local Records; or, Historical Register of rema... Author T. Fordyce Flickr URL http://www.flickr.com/photos/britishlibrary/ta... Name: 4157862, dtype: object >>> df.loc[4159587] Place of Publication Newcastle upon Tyne Date of Publication 1834 Publisher Mackenzie & Dent Title An historical, topographical and descriptive v... Author E. (Eneas) Mackenzie Flickr URL http://www.flickr.com/photos/britishlibrary/ta... Name: 4159587, dtype: object
這兩本書在同一個地方出版,但是一個有連字符,另一個沒有。
為了一次性清洗這個列,我們使用str.contains()來獲取一個布爾值。
我們清洗的列如下:
>>> pub = df["Place of Publication"] >>> london = pub.str.contains("London") >>> london[:5] Identifier 206 True 216 True 218 True 472 True 480 True Name: Place of Publication, dtype: bool >>> oxford = pub.str.contains("Oxford")
我們將它與np.where結合。
df["Place of Publication"] = np.where(london, "London", np.where(oxford, "Oxford", pub.str.replace("-", " "))) >>> df["Place of Publication"].head() Identifier 206 London 216 London 218 London 472 London 480 London Name: Place of Publication, dtype: object
這里,np.where方程在一個嵌套的結構中被調用,condition是一個通過st.contains()得到的布爾的Series。contains()方法與Python內建的in關鍵字一樣,用于發現一個個體是否發生在一個迭代器中。
使用的替代物是一個代表我們期望的出版社地址字符串。我們也使用str.replace()將連字符替換為空格,然后給DataFrame中的列重新賦值。
盡管數據集中還有更多的不干凈數據,但是我們現在僅討論這兩列。
讓我們看看前五行,現在看起來比我們剛開始的時候好點了。
>>> df.head() Place of Publication Date of Publication Publisher 206 London 1879 S. Tinsley & Co. 216 London 1868 Virtue & Co. 218 London 1869 Bradbury, Evans & Co. 472 London 1851 James Darling 480 London 1857 Wertheim & Macintosh Title Author 206 Walter Forbes. [A novel.] By A. A AA 216 All for Greed. [A novel. The dedication signed... A. A A. 218 Love the Avenger. By the author of “All for Gr... A. A A. 472 Welsh Sketches, chiefly ecclesiastical, to the... E. S A. 480 [The World in which I live, and my place in it... E. S A. Flickr URL 206 http://www.flickr.com/photos/britishlibrary/ta... 216 http://www.flickr.com/photos/britishlibrary/ta... 218 http://www.flickr.com/photos/britishlibrary/ta... 472 http://www.flickr.com/photos/britishlibrary/ta... 480 http://www.flickr.com/photos/britishlibrary/ta...
在這一點上,Place of Publication就是一個很好的需要被轉換成分類數據的類型,因為我們可以用整數將這相當小的唯一城市集編碼。(分類數據的使用內存與分類的數量以及數據的長度成正比)使用applymap方法清洗整個數據集
在一定的情況下,你將看到并不是僅僅有一條列不干凈,而是更多的。
在一些實例中,使用一個定制的函數到DataFrame的每一個元素將會是很有幫助的。pandas的applyma()方法與內建的map()函數相似,并且簡單的應用到一個DataFrame中的所有元素上。
讓我們看一個例子。我們將基于"university_towns.txt"文件創建一個DataFrame。
$ head Datasets/univerisity_towns.txt Alabama[edit] Auburn (Auburn University)[1] Florence (University of North Alabama) Jacksonville (Jacksonville State University)[2] Livingston (University of West Alabama)[2] Montevallo (University of Montevallo)[2] Troy (Troy University)[2] Tuscaloosa (University of Alabama, Stillman College, Shelton State)[3][4] Tuskegee (Tuskegee University)[5] Alaska[edit]
我們可以看到每個state后邊都有一些在那個state的大學城:StateA TownA1 TownA2 StateB TownB1 TownB2...。如果我們仔細觀察state名字的寫法,我們會發現它們都有"[edit]"的自字符串。
我們可以利用這個特征創建一個含有(state,city)元組的列表,并將這個列表嵌入到DdataFrame中,
>>> university_towns = [] >>> with open("Datasets/university_towns.txt") as file: ... for line in file: ... if "[edit]" in line: ... # Remember this `state` until the next is found ... state = line ... else: ... # Otherwise, we have a city; keep `state` as last-seen ... university_towns.append((state, line)) >>> university_towns[:5] [("Alabama[edit] ", "Auburn (Auburn University)[1] "), ("Alabama[edit] ", "Florence (University of North Alabama) "), ("Alabama[edit] ", "Jacksonville (Jacksonville State University)[2] "), ("Alabama[edit] ", "Livingston (University of West Alabama)[2] "), ("Alabama[edit] ", "Montevallo (University of Montevallo)[2] ")]
我們可以在DataFrame中包裝這個列表,并設列名為"State"和"RegionName"。pandas將會使用列表中的每個元素,然后設置State到左邊的列,RegionName到右邊的列。
最終的DataFrame是這樣的:
>>> towns_df = pd.DataFrame(university_towns, ... columns=["State", "RegionName"]) >>> towns_df.head() State RegionName 0 Alabama[edit] Auburn (Auburn University)[1] 1 Alabama[edit] Florence (University of North Alabama) 2 Alabama[edit] Jacksonville (Jacksonville State University)[2] 3 Alabama[edit] Livingston (University of West Alabama)[2] 4 Alabama[edit] Montevallo (University of Montevallo)[2]
我們可以像上面使用for loop來進行清洗,但是pandas提供了更簡單的辦法。我們只需要state name和town name,然后就可以移除所以其他的了。這里我們可以再次使用pandas的.str()方法,同時我們也可以使用applymap()將一個python callable映射到DataFrame中的每個元素上。
我們一直在使用"元素"這個攝于,但是我們到底是什么意思呢?看看下面這個"toy"的DataFrame:
0 1 0 Mock Dataset 1 Python Pandas 2 Real Python 3 NumPy Clean
在這個例子中,每個單元 (‘Mock’, ‘Dataset’, ‘Python’, ‘Pandas’, etc.) 都是一個元素。因此,applymap()將分別應用一個函數到這些元素上。讓我們定義這個函數。
>>> def get_citystate(item): ... if " (" in item: ... return item[:item.find(" (")] ... elif "[" in item: ... return item[:item.find("[")] ... else: ... return item
pandas的applymap()只用一個參數,就是要應用到每個元素上的函數(callable)。
>>> towns_df = towns_df.applymap(get_citystate)
首先,我們定義一個函數,它將從DataFrame中獲取每一個元素作為自己的參數。在這個函數中,檢驗元素中是否有一個(或者[。
基于上面的檢查,函數返回相應的值。最后,applymap()函數被用在我們的對象上。現在DataFrame就看起來更干靜了。
>>> towns_df.head() State RegionName 0 Alabama Auburn 1 Alabama Florence 2 Alabama Jacksonville 3 Alabama Livingston 4 Alabama Montevallo
applymap()方法從DataFrame中提取每個元素,傳遞到函數中,然后覆蓋原來的值。就是這么簡單!
技術細節:雖然.applymap是一個方便和靈活的方法,但是對于大的數據集它將會花費很長時間運行,因為它需要將python callable應用到每個元素上。一些情況中,使用Cython或者NumPY的向量化的操作會更高效。重命名列和移除行
經常的,你處理的數據集會有讓你不太容易理解的列名,或者在頭幾行或最后幾行有一些不重要的信息,例如術語定義,或是附注。
這種情況下,我們想重新命名列和移除一定的行以讓我們只留下正確和有意義的信息。
為了證明我們如何處理它,我們先看一下"olympics.csv"數據集的頭5行:
$ head -n 5 Datasets/olympics.csv 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ,? Summer,01 !,02 !,03 !,Total,? Winter,01 !,02 !,03 !,Total,? Games,01 !,02 !,03 !,Combined total Afghanistan (AFG),13,0,0,2,2,0,0,0,0,0,13,0,0,2,2 Algeria (ALG),12,5,2,8,15,3,0,0,0,0,15,5,2,8,15 Argentina (ARG),23,18,24,28,70,18,0,0,0,0,41,18,24,28,70
現在我們將它讀入pandas的DataFrame。
>>> olympics_df = pd.read_csv("Datasets/olympics.csv") >>> olympics_df.head() 0 1 2 3 4 5 6 7 8 0 NaN ? Summer 01 ! 02 ! 03 ! Total ? Winter 01 ! 02 ! 1 Afghanistan (AFG) 13 0 0 2 2 0 0 0 2 Algeria (ALG) 12 5 2 8 15 3 0 0 3 Argentina (ARG) 23 18 24 28 70 18 0 0 4 Armenia (ARM) 5 1 2 9 12 6 0 0 9 10 11 12 13 14 15 0 03 ! Total ? Games 01 ! 02 ! 03 ! Combined total 1 0 0 13 0 0 2 2 2 0 0 15 5 2 8 15 3 0 0 41 18 24 28 70 4 0 0 11 1 2 9 12
這的確有點亂!列名是以整數的字符串形式索引的,以0開始。本應該是列名的行卻處在olympics_df.iloc[0]。發生這個是因為CSV文件以0, 1, 2, …, 15起始的。
同樣,如果我們去數據集的源文件觀察,上面的NaN真的應該是像"Country"這樣的,? Summer應該代表"Summer Games", 而01 !應該是"Gold"之類的。
因此,我們需要做兩件事:
移除第一行并設置header為第一行
重新命名列
當我們讀CSV文件的時候,可以通過傳遞一些參數到read_csv函數來移除行和設置列名稱。
這個函數有很多可選桉樹,但是這里我們只需要header
來移除第0行:
>>> olympics_df = pd.read_csv("Datasets/olympics.csv", header=1) >>> olympics_df.head() Unnamed: 0 ? Summer 01 ! 02 ! 03 ! Total ? Winter 0 Afghanistan (AFG) 13 0 0 2 2 0 1 Algeria (ALG) 12 5 2 8 15 3 2 Argentina (ARG) 23 18 24 28 70 18 3 Armenia (ARM) 5 1 2 9 12 6 4 Australasia (ANZ) [ANZ] 2 3 4 5 12 0 01 !.1 02 !.1 03 !.1 Total.1 ? Games 01 !.2 02 !.2 03 !.2 0 0 0 0 0 13 0 0 2 1 0 0 0 0 15 5 2 8 2 0 0 0 0 41 18 24 28 3 0 0 0 0 11 1 2 9 4 0 0 0 0 2 3 4 5 Combined total 0 2 1 15 2 70 3 12 4 12
我們現在有了設置為header的正確行,并且所有沒用的行都被移除了。記錄一下pandas是如何將包含國家的列名NaN改變為Unnamed:0的。
為了重命名列,我們將使用DataFrame的rename()方法,允許你以一個映射(這里是一個字典)重新標記一個軸。
讓我們開始定義一個字典來將現在的列名稱(鍵)映射到更多的可用列名稱(字典的值)。
>>> new_names = {"Unnamed: 0": "Country", ... "? Summer": "Summer Olympics", ... "01 !": "Gold", ... "02 !": "Silver", ... "03 !": "Bronze", ... "? Winter": "Winter Olympics", ... "01 !.1": "Gold.1", ... "02 !.1": "Silver.1", ... "03 !.1": "Bronze.1", ... "? Games": "# Games", ... "01 !.2": "Gold.2", ... "02 !.2": "Silver.2", ... "03 !.2": "Bronze.2"}
我們在對象上調用rename()函數:
>>> olympics_df.rename(columns=new_names, inplace=True)
設置inplace為True可以讓我們的改變直接反映在對象上。讓我們看看是否正確:
>>> olympics_df.head() Country Summer Olympics Gold Silver Bronze Total 0 Afghanistan (AFG) 13 0 0 2 2 1 Algeria (ALG) 12 5 2 8 15 2 Argentina (ARG) 23 18 24 28 70 3 Armenia (ARM) 5 1 2 9 12 4 Australasia (ANZ) [ANZ] 2 3 4 5 12 Winter Olympics Gold.1 Silver.1 Bronze.1 Total.1 # Games Gold.2 0 0 0 0 0 0 13 0 1 3 0 0 0 0 15 5 2 18 0 0 0 0 41 18 3 6 0 0 0 0 11 1 4 0 0 0 0 0 2 3 Silver.2 Bronze.2 Combined total 0 0 2 2 1 2 8 15 2 24 28 70 3 2 9 12 4 4 5 12Python數據清洗:回顧
這個教程中,你學會了從數據集中如何使用drop()函數去除不必要的信息,也學會了如何為數據集設置索引,以讓items可以被容易的找到。
更多的,你學會了如何使用.str()清洗對象字段,以及如何使用applymap對整個數據集清洗。最后,我們探索了如何移除CSV文件的行,并且使用rename()方法重命名列。
掌握數據清洗非常重要,因為它是數據科學的一個大的部分。你現在應該有了一個如何使用pandas和numpy進行數據清洗的基本理解了。
參考:https://realpython.com/python...
關注微信公眾號Python數據科學,獲取 120G 人工智能 學習資料。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44698.html
小編寫這篇文章的主要目的,主要是來給大家解答下關于python數學建模的一些相關的介紹,涉及到內容涵蓋Numpy的一些相關的應用具體的一些介紹。另外,還會涉及到相關的Pandas學習知識,具體內容下面給大家詳細解答下。 1 Numpy介紹與應用 1-1Numpy是什么 NumPy是一個運行速度非??斓臄祵W庫,一個開源的的python科學計算庫,主要用于數組、矩陣計算,包含: 一個強大的...
小編寫這篇文章的一個主要目的,主要是來給大家去做一個介紹。介紹的內容主要是關于建模知識的一些相關介紹,包括其Pandas的一些相關學習,就具體的操作內容,下面就給大家詳細解答下?! umpy學習 1 Numpy介紹與應用 1-1Numpy是什么 NumPy是一個運行速度非??斓臄祵W庫,一個開源的的python科學計算庫,主要用于數組、矩陣計算,包含: 一個強大的N維數組對象ndarr...
摘要:編程基礎要學習如何用進行數據分析,數據分析師建議第一步是要了解一些的編程基礎,知道的數據結構,什么是向量列表數組字典等等了解的各種函數及模塊。數據分析師認為數據分析有的工作都在處理數據。 showImg(https://segmentfault.com/img/bVbnbZo?w=1024&h=653); 本文為CDA數據分析研究院原創作品,轉載需授權 1.為什么選擇Python進行數...
寫這篇文章的主要目的是,為一些新手講些一些知識,包括python numpy中array與pandas的DataFrame轉換方式的相關問題,具體代碼已給大家貼出來了,大家可以好好的閱讀?! umpy array與pandas的DataFrame轉換 1.numpy的array轉換為pandas的DataFrame mat為array數組,df為轉換的DataFrame數據表 arra...
小編寫這篇文章的主要目的,主要是來給大家去做一個介紹的,介紹的內容主要還是涉及到python的一些相關事情,比如我們可以利用python去進行搭建數字建模的相關平臺。其中,主要的內容有加深Numpy和Pandas的相關學習,具體內容,下面給大家詳細解答下?! umpy學習 #Numpy的基本使用 ''' Numpy提供了兩種基本的對象:ndarray存儲單一...
閱讀 2761·2021-09-24 10:34
閱讀 1862·2021-09-22 10:02
閱讀 2252·2021-09-09 09:33
閱讀 1458·2021-08-13 15:02
閱讀 3270·2020-12-03 17:10
閱讀 1180·2019-08-30 15:44
閱讀 2144·2019-08-30 12:58
閱讀 3229·2019-08-26 13:40