成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用Pandas&NumPy進(jìn)行數(shù)據(jù)清洗的6大常用方法

siberiawolf / 1947人閱讀

摘要:在這個(gè)教程中,我們將利用的和包來(lái)進(jìn)行數(shù)據(jù)清洗。在很多情況下,使用唯一的值作為索引值識(shí)別數(shù)據(jù)字段是非常有幫助的。清洗數(shù)據(jù)字段到現(xiàn)在為止,我們移除了不必要的列并改變了我們的索引變得更有意義。

作者:xiaoyu
微信公眾號(hào):Python數(shù)據(jù)科學(xué)
知乎:Python數(shù)據(jù)分析師


數(shù)據(jù)科學(xué)家花了大量的時(shí)間清洗數(shù)據(jù)集,并將這些數(shù)據(jù)轉(zhuǎn)換為他們可以處理的格式。事實(shí)上,很多數(shù)據(jù)科學(xué)家聲稱開始獲取和清洗數(shù)據(jù)的工作量要占整個(gè)工作的80%。

因此,如果你正巧也在這個(gè)領(lǐng)域中,或者計(jì)劃進(jìn)入這個(gè)領(lǐng)域,那么處理這些雜亂不規(guī)則數(shù)據(jù)是非常重要的,這些雜亂數(shù)據(jù)包括一些缺失值,不連續(xù)格式,錯(cuò)誤記錄,或者是沒有意義的異常值。

在這個(gè)教程中,我們將利用Python的PandasNumpy包來(lái)進(jìn)行數(shù)據(jù)清洗。

主要內(nèi)容如下:

刪除 DataFrame 中的不必要 columns

改變 DataFrame 的 index

使用 .str() 方法來(lái)清洗 columns

使用 DataFrame.applymap() 函數(shù)按元素的清洗整個(gè)數(shù)據(jù)集

重命名 columns 為一組更易識(shí)別的標(biāo)簽

濾除 CSV文件中不必要的 rows

下面是要用到的數(shù)據(jù)集:

BL-Flickr-Images-Book.csv - 一份來(lái)自英國(guó)圖書館包含關(guān)于書籍信息的CSV文檔

university_towns.txt - 一份包含美國(guó)各大洲大學(xué)城名稱的text文檔

olympics.csv - 一份總結(jié)了各國(guó)家參加夏季與冬季奧林匹克運(yùn)動(dòng)會(huì)情況的CSV文檔

你可以從Real Python 的 GitHub repository 下載數(shù)據(jù)集來(lái)進(jìn)行下面的例子。

注意:建議使用Jupter Notebooks來(lái)學(xué)習(xí)下面的知識(shí)。

學(xué)習(xí)之前假設(shè)你已經(jīng)有了對(duì)Pandas和Numpy庫(kù)的基本認(rèn)識(shí),包括Pandas的工作基礎(chǔ)SeriesDataFrame對(duì)象,應(yīng)用到這些對(duì)象上的常用方法,以及熟悉了NumPy的NaN值。

讓我們導(dǎo)入這些模塊開始我們的學(xué)習(xí)。

>>> import pandas as pd
>>> import numpy as np
刪除DataFrame的列

經(jīng)常的,你會(huì)發(fā)現(xiàn)數(shù)據(jù)集中不是所有的字段類型都是有用的。例如,你可能有一個(gè)關(guān)于學(xué)生信息的數(shù)據(jù)集,包含姓名,分?jǐn)?shù),標(biāo)準(zhǔn),父母姓名,住址等具體信息,但是你只想分析學(xué)生的分?jǐn)?shù)。

這個(gè)情況下,住址或者父母姓名信息對(duì)你來(lái)說就不是很重要。這些沒有用的信息會(huì)占用不必要的空間,并會(huì)使運(yùn)行時(shí)間減慢。

Pandas提供了一個(gè)非常便捷的方法drop()函數(shù)來(lái)移除一個(gè)DataFrame中不想要的行或列。讓我們看一個(gè)簡(jiǎn)單的例子如何從DataFrame中移除列。

首先,我們引入BL-Flickr-Images-Book.csv文件,并創(chuàng)建一個(gè)此文件的DataFrame。在下面這個(gè)例子中,我們?cè)O(shè)置了一個(gè)pd.read_csv的相對(duì)路徑,意味著所有的數(shù)據(jù)集都在Datasets文件夾下的當(dāng)前工作目錄中:

>>> 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()方法得到了前五個(gè)行信息,這些列提供了對(duì)圖書館有幫助的輔助信息,但是并不能很好的描述這些書籍: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)

在上面,我們定義了一個(gè)包含我們不要的列的名稱列表。接著,我們?cè)趯?duì)象上調(diào)用drop()函數(shù),其中inplace參數(shù)是True,axis參數(shù)是1。這告訴了Pandas我們想要直接在我們的對(duì)象上發(fā)生改變,并且它應(yīng)該可以尋找對(duì)象中被移除列的信息。

我們?cè)俅慰匆幌翫ataFrame,我們會(huì)看到不要想的信息已經(jīng)被移除了。

>>> 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參數(shù)賦值直接移除列,而就不用分別定義to_drop列表和axis了。

>>> df.drop(columns=to_drop, inplace=True)

這種語(yǔ)法更直觀更可讀。我們這里將要做什么就很明顯了。

改變DataFrame的索引

Pandas索引index擴(kuò)展了Numpy數(shù)組的功能,以允許更多多樣化的切分和標(biāo)記。在很多情況下,使用唯一的值作為索引值識(shí)別數(shù)據(jù)字段是非常有幫助的。

例如,仍然使用上一節(jié)的數(shù)據(jù)集,可以想象當(dāng)一個(gè)圖書管理員尋找一個(gè)記錄,他們也許會(huì)輸入一個(gè)唯一標(biāo)識(shí)來(lái)定位一本書。

>>> df["Identifier"].is_unique
True

讓我們用set_index把已經(jīng)存在的索引改為這個(gè)列。

>>> 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...
技術(shù)細(xì)節(jié):不像在SQL中的主鍵一樣,pandas的索引不保證唯一性,盡管許多索引和合并操作將會(huì)使運(yùn)行時(shí)間變長(zhǎng)如果是這樣。

我們可以用一個(gè)直接的方法loc[]來(lái)獲取每一條記錄。盡管loc[]這個(gè)詞可能看上去沒有那么直觀,但它允許我們使用基于標(biāo)簽的索引,這個(gè)索引是行的標(biāo)簽或者不考慮位置的記錄。

>>> 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是索引的第一個(gè)標(biāo)簽。如果想通過位置獲取它,我們可以使用df.iloc[0],是一個(gè)基于位置的索引。

之前,我們的索引是一個(gè)范圍索引:從0開始的整數(shù),類似Python的內(nèi)建range。通過給set_index一個(gè)列名,我們就把索引變成了Identifier中的值。

你也許注意到了我們通過df = df.set_index(...)的返回變量重新給對(duì)象賦了值。這是因?yàn)椋J(rèn)的情況下,這個(gè)方法返回一個(gè)被改變對(duì)象的拷貝,并且它不會(huì)直接對(duì)原對(duì)象做任何改變。我們可以通過設(shè)置參數(shù)inplace來(lái)避免這個(gè)問題。

df.set_index("Identifier", inplace=True)
清洗數(shù)據(jù)字段

到現(xiàn)在為止,我們移除了不必要的列并改變了我們的索引變得更有意義。這個(gè)部分,我們將清洗特殊的列,并使它們變成統(tǒng)一的格式,這樣可以更好的理解數(shù)據(jù)集和加強(qiáng)連續(xù)性。特別的,我們將清洗Date of PublicationPlace of Publication。

根據(jù)上面觀察,所有的數(shù)據(jù)類型都是現(xiàn)在的objectdtype類型,差不多類似于Python中的str。

它包含了一些不能被適用于數(shù)值或是分類的數(shù)據(jù)。這也正常,因?yàn)槲覀冋谔幚磉@些初始值就是雜亂無(wú)章字符串的數(shù)據(jù)。

>>> df.get_dtype_counts()
object    6

一個(gè)需要被改變?yōu)閿?shù)值的的字段是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

一本書只能有一個(gè)出版日期data of publication。因此,我們需要做以下的一些事情:

移除在方括號(hào)內(nèi)的額外日期,任何存在的:1879[1878]。

將日期范圍轉(zhuǎn)化為它們的起始日期,任何存在的:1860-63;1839,38-54。

完全移除我們不關(guān)心的日期,并用Numpy的NaN替換:[1879?]。

將字符串nan轉(zhuǎn)化為Numpy的NaN值。

考慮這些模式,我們可以用一個(gè)簡(jiǎn)單的正則表達(dá)式來(lái)提取出版日期:

regex = r"^(d{4})"

上面正則表達(dá)式的意思在字符串開頭尋找任何四位數(shù)字,符合我們的情況。

d代表任何數(shù)字,{4}重復(fù)這個(gè)規(guī)則四次。^符號(hào)匹配一個(gè)字符串最開始的部分,圓括號(hào)表示一個(gè)分組,提示pandas我們想要提取正則表達(dá)式的部分。

讓我們看看運(yùn)行這個(gè)正則在數(shù)據(jù)集上之后會(huì)發(fā)生什么。

>>> 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

其實(shí)這個(gè)列仍然是一個(gè)object類型,但是我們可以使用pd.to_numeric輕松的得到數(shù)字的版本:

>>> df["Date of Publication"] = pd.to_numeric(extr)
>>> df["Date of Publication"].dtype
dtype("float64")

這個(gè)結(jié)果中,10個(gè)值里大約有1個(gè)值缺失,這讓我們付出了很小的代價(jià)來(lái)對(duì)剩余有效的值做計(jì)算。

>>> df["Date of Publication"].isnull().sum() / len(df)
0.11717147339205986
結(jié)合str方法與Numpy清洗列

上面,你可以觀察到df["Date of Publication"].str. 的使用。這個(gè)屬性是pandas里的一種提升字符串操作速度的方法,并有大量的Python字符串或編譯的正則表達(dá)式上的小操作,例如.split(),.replace(),和.capitalize()。

為了清洗Place of Publication字段,我們可以結(jié)合pandas的str方法和numpy的np.where函數(shù)配合完成。
它的語(yǔ)法如下:

>>> np.where(condition, then, else)

這里,condition可以使一個(gè)類數(shù)組的對(duì)象,也可以是一個(gè)布爾表達(dá)。如果condition值為真,那么then將被使用,否則使用else。

它也可以組網(wǎng)使用,允許我們基于多個(gè)條件進(jìn)行計(jì)算。

>>> np.where(condition1, x1, 
        np.where(condition2, x2, 
            np.where(condition3, x3, ...)))

我們將使用這兩個(gè)方程來(lái)清洗Place of Publication由于這列有字符串對(duì)象。以下是這個(gè)列的內(nèi)容:

>>> 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

我們看到,對(duì)于一些行,place of publication還被一些其它沒有用的信息圍繞著。如果我們看更多的值,我們發(fā)現(xiàn)這種情況中有些行

讓我們看看兩個(gè)特殊的:

>>> 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

這兩本書在同一個(gè)地方出版,但是一個(gè)有連字符,另一個(gè)沒有。

為了一次性清洗這個(gè)列,我們使用str.contains()來(lái)獲取一個(gè)布爾值。

我們清洗的列如下:

>>> 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結(jié)合。

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方程在一個(gè)嵌套的結(jié)構(gòu)中被調(diào)用,condition是一個(gè)通過st.contains()得到的布爾的Series。contains()方法與Python內(nèi)建的in關(guān)鍵字一樣,用于發(fā)現(xiàn)一個(gè)個(gè)體是否發(fā)生在一個(gè)迭代器中。

使用的替代物是一個(gè)代表我們期望的出版社地址字符串。我們也使用str.replace()將連字符替換為空格,然后給DataFrame中的列重新賦值。

盡管數(shù)據(jù)集中還有更多的不干凈數(shù)據(jù),但是我們現(xiàn)在僅討論這兩列。

讓我們看看前五行,現(xiàn)在看起來(lái)比我們剛開始的時(shí)候好點(diǎn)了。

>>> 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...
在這一點(diǎn)上,Place of Publication就是一個(gè)很好的需要被轉(zhuǎn)換成分類數(shù)據(jù)的類型,因?yàn)槲覀兛梢杂谜麛?shù)將這相當(dāng)小的唯一城市集編碼。(分類數(shù)據(jù)的使用內(nèi)存與分類的數(shù)量以及數(shù)據(jù)的長(zhǎng)度成正比)
使用applymap方法清洗整個(gè)數(shù)據(jù)集

在一定的情況下,你將看到并不是僅僅有一條列不干凈,而是更多的。

在一些實(shí)例中,使用一個(gè)定制的函數(shù)到DataFrame的每一個(gè)元素將會(huì)是很有幫助的。pandasapplyma()方法與內(nèi)建的map()函數(shù)相似,并且簡(jiǎn)單的應(yīng)用到一個(gè)DataFrame中的所有元素上。

讓我們看一個(gè)例子。我們將基于"university_towns.txt"文件創(chuàng)建一個(gè)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]

我們可以看到每個(gè)state后邊都有一些在那個(gè)state的大學(xué)城:StateA TownA1 TownA2 StateB TownB1 TownB2...。如果我們仔細(xì)觀察state名字的寫法,我們會(huì)發(fā)現(xiàn)它們都有"[edit]"的自字符串。

我們可以利用這個(gè)特征創(chuàng)建一個(gè)含有(state,city)元組的列表,并將這個(gè)列表嵌入到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中包裝這個(gè)列表,并設(shè)列名為"State"和"RegionName"。pandas將會(huì)使用列表中的每個(gè)元素,然后設(shè)置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來(lái)進(jìn)行清洗,但是pandas提供了更簡(jiǎn)單的辦法。我們只需要state name和town name,然后就可以移除所以其他的了。這里我們可以再次使用pandas的.str()方法,同時(shí)我們也可以使用applymap()將一個(gè)python callable映射到DataFrame中的每個(gè)元素上。

我們一直在使用"元素"這個(gè)攝于,但是我們到底是什么意思呢?看看下面這個(gè)"toy"的DataFrame:

        0           1
0    Mock     Dataset
1  Python     Pandas
2    Real     Python
3   NumPy     Clean

在這個(gè)例子中,每個(gè)單元 (‘Mock’, ‘Dataset’, ‘Python’, ‘Pandas’, etc.) 都是一個(gè)元素。因此,applymap()將分別應(yīng)用一個(gè)函數(shù)到這些元素上。讓我們定義這個(gè)函數(shù)。

>>> def get_citystate(item):
...     if " (" in item:
...         return item[:item.find(" (")]
...     elif "[" in item:
...         return item[:item.find("[")]
...     else:
...         return item

pandas的applymap()只用一個(gè)參數(shù),就是要應(yīng)用到每個(gè)元素上的函數(shù)(callable)。

>>> towns_df =  towns_df.applymap(get_citystate)

首先,我們定義一個(gè)函數(shù),它將從DataFrame中獲取每一個(gè)元素作為自己的參數(shù)。在這個(gè)函數(shù)中,檢驗(yàn)元素中是否有一個(gè)(或者[。

基于上面的檢查,函數(shù)返回相應(yīng)的值。最后,applymap()函數(shù)被用在我們的對(duì)象上。現(xiàn)在DataFrame就看起來(lái)更干靜了。

>>> towns_df.head()
     State    RegionName
0  Alabama        Auburn
1  Alabama      Florence
2  Alabama  Jacksonville
3  Alabama    Livingston
4  Alabama    Montevallo

applymap()方法從DataFrame中提取每個(gè)元素,傳遞到函數(shù)中,然后覆蓋原來(lái)的值。就是這么簡(jiǎn)單!

技術(shù)細(xì)節(jié):雖然.applymap是一個(gè)方便和靈活的方法,但是對(duì)于大的數(shù)據(jù)集它將會(huì)花費(fèi)很長(zhǎng)時(shí)間運(yùn)行,因?yàn)樗枰獙ython callable應(yīng)用到每個(gè)元素上。一些情況中,使用Cython或者NumPY的向量化的操作會(huì)更高效。
重命名列和移除行

經(jīng)常的,你處理的數(shù)據(jù)集會(huì)有讓你不太容易理解的列名,或者在頭幾行或最后幾行有一些不重要的信息,例如術(shù)語(yǔ)定義,或是附注。

這種情況下,我們想重新命名列和移除一定的行以讓我們只留下正確和有意義的信息。

為了證明我們?nèi)绾翁幚硭覀兿瓤匆幌?olympics.csv"數(shù)據(jù)集的頭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

現(xiàn)在我們將它讀入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

這的確有點(diǎn)亂!列名是以整數(shù)的字符串形式索引的,以0開始。本應(yīng)該是列名的行卻處在olympics_df.iloc[0]。發(fā)生這個(gè)是因?yàn)镃SV文件以0, 1, 2, …, 15起始的。

同樣,如果我們?nèi)?shù)據(jù)集的源文件觀察,上面的NaN真的應(yīng)該是像"Country"這樣的,? Summer應(yīng)該代表"Summer Games", 而01 !應(yīng)該是"Gold"之類的。

因此,我們需要做兩件事:

移除第一行并設(shè)置header為第一行

重新命名列

當(dāng)我們讀CSV文件的時(shí)候,可以通過傳遞一些參數(shù)到read_csv函數(shù)來(lái)移除行和設(shè)置列名稱。

這個(gè)函數(shù)有很多可選桉樹,但是這里我們只需要header
來(lái)移除第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

我們現(xiàn)在有了設(shè)置為header的正確行,并且所有沒用的行都被移除了。記錄一下pandas是如何將包含國(guó)家的列名NaN改變?yōu)?b>Unnamed:0的。

為了重命名列,我們將使用DataFrame的rename()方法,允許你以一個(gè)映射(這里是一個(gè)字典)重新標(biāo)記一個(gè)軸。

讓我們開始定義一個(gè)字典來(lái)將現(xiàn)在的列名稱(鍵)映射到更多的可用列名稱(字典的值)。

>>> 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"}

我們?cè)趯?duì)象上調(diào)用rename()函數(shù):

>>> olympics_df.rename(columns=new_names, inplace=True)

設(shè)置inplaceTrue可以讓我們的改變直接反映在對(duì)象上。讓我們看看是否正確:

>>> 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              12
Python數(shù)據(jù)清洗:回顧

這個(gè)教程中,你學(xué)會(huì)了從數(shù)據(jù)集中如何使用drop()函數(shù)去除不必要的信息,也學(xué)會(huì)了如何為數(shù)據(jù)集設(shè)置索引,以讓items可以被容易的找到。

更多的,你學(xué)會(huì)了如何使用.str()清洗對(duì)象字段,以及如何使用applymap對(duì)整個(gè)數(shù)據(jù)集清洗。最后,我們探索了如何移除CSV文件的行,并且使用rename()方法重命名列。

掌握數(shù)據(jù)清洗非常重要,因?yàn)樗菙?shù)據(jù)科學(xué)的一個(gè)大的部分。你現(xiàn)在應(yīng)該有了一個(gè)如何使用pandas和numpy進(jìn)行數(shù)據(jù)清洗的基本理解了。

參考:https://realpython.com/python...

關(guān)注微信公眾號(hào)Python數(shù)據(jù)科學(xué),獲取 120G 人工智能 學(xué)習(xí)資料。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44698.html

相關(guān)文章

  • python數(shù)學(xué)建模Numpy應(yīng)用介紹與Pandas學(xué)習(xí)

      小編寫這篇文章的主要目的,主要是來(lái)給大家解答下關(guān)于python數(shù)學(xué)建模的一些相關(guān)的介紹,涉及到內(nèi)容涵蓋Numpy的一些相關(guān)的應(yīng)用具體的一些介紹。另外,還會(huì)涉及到相關(guān)的Pandas學(xué)習(xí)知識(shí),具體內(nèi)容下面給大家詳細(xì)解答下。  1 Numpy介紹與應(yīng)用  1-1Numpy是什么  NumPy是一個(gè)運(yùn)行速度非??斓臄?shù)學(xué)庫(kù),一個(gè)開源的的python科學(xué)計(jì)算庫(kù),主要用于數(shù)組、矩陣計(jì)算,包含:  一個(gè)強(qiáng)大的...

    89542767 評(píng)論0 收藏0
  • python數(shù)學(xué)建模之Numpy應(yīng)用介紹與Pandas學(xué)習(xí)

      小編寫這篇文章的一個(gè)主要目的,主要是來(lái)給大家去做一個(gè)介紹。介紹的內(nèi)容主要是關(guān)于建模知識(shí)的一些相關(guān)介紹,包括其Pandas的一些相關(guān)學(xué)習(xí),就具體的操作內(nèi)容,下面就給大家詳細(xì)解答下?! umpy學(xué)習(xí)  1 Numpy介紹與應(yīng)用  1-1Numpy是什么  NumPy是一個(gè)運(yùn)行速度非??斓臄?shù)學(xué)庫(kù),一個(gè)開源的的python科學(xué)計(jì)算庫(kù),主要用于數(shù)組、矩陣計(jì)算,包含:  一個(gè)強(qiáng)大的N維數(shù)組對(duì)象ndarr...

    89542767 評(píng)論0 收藏0
  • 如何用Python進(jìn)行數(shù)據(jù)分析?

    摘要:編程基礎(chǔ)要學(xué)習(xí)如何用進(jìn)行數(shù)據(jù)分析,數(shù)據(jù)分析師建議第一步是要了解一些的編程基礎(chǔ),知道的數(shù)據(jù)結(jié)構(gòu),什么是向量列表數(shù)組字典等等了解的各種函數(shù)及模塊。數(shù)據(jù)分析師認(rèn)為數(shù)據(jù)分析有的工作都在處理數(shù)據(jù)。 showImg(https://segmentfault.com/img/bVbnbZo?w=1024&h=653); 本文為CDA數(shù)據(jù)分析研究院原創(chuàng)作品,轉(zhuǎn)載需授權(quán) 1.為什么選擇Python進(jìn)行數(shù)...

    lifefriend_007 評(píng)論0 收藏0
  • python numpy中array與pandasDataFrame轉(zhuǎn)換方式

      寫這篇文章的主要目的是,為一些新手講些一些知識(shí),包括python numpy中array與pandas的DataFrame轉(zhuǎn)換方式的相關(guān)問題,具體代碼已給大家貼出來(lái)了,大家可以好好的閱讀?! umpy array與pandas的DataFrame轉(zhuǎn)換  1.numpy的array轉(zhuǎn)換為pandas的DataFrame  mat為array數(shù)組,df為轉(zhuǎn)換的DataFrame數(shù)據(jù)表  arra...

    89542767 評(píng)論0 收藏0
  • python數(shù)學(xué)建模是加深NumpyPandas學(xué)習(xí)

      小編寫這篇文章的主要目的,主要是來(lái)給大家去做一個(gè)介紹的,介紹的內(nèi)容主要還是涉及到python的一些相關(guān)事情,比如我們可以利用python去進(jìn)行搭建數(shù)字建模的相關(guān)平臺(tái)。其中,主要的內(nèi)容有加深Numpy和Pandas的相關(guān)學(xué)習(xí),具體內(nèi)容,下面給大家詳細(xì)解答下?! umpy學(xué)習(xí)  #Numpy的基本使用   '''   Numpy提供了兩種基本的對(duì)象:ndarray存儲(chǔ)單一...

    89542767 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<