一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

整理了25個Pandas實用技巧(下)

 北方的白樺林 2020-05-03

從剪貼板中創(chuàng)建DataFrame



假設(shè)你將一些數(shù)據(jù)儲存在Excel或者Google Sheet中,你又想要盡快地將他們讀取至DataFrame中。


你需要選擇這些數(shù)據(jù)并復(fù)制至剪貼板。然后,你可以使用read_clipboard()函數(shù)將他們讀取至DataFrame中:




和read_csv()類似,read_clipboard()會自動檢測每一列的正確的數(shù)據(jù)類型:




讓我們再復(fù)制另外一個數(shù)據(jù)至剪貼板:




神奇的是,pandas已經(jīng)將第一列作為索引了:




需要注意的是,如果你想要你的工作在未來可復(fù)制,那么read_clipboard()并不值得推薦。


將DataFrame劃分為兩個隨機(jī)的子集



假設(shè)你想要將一個DataFrame劃分為兩部分,隨機(jī)地將75%的行給一個DataFrame,剩下的25%的行給另一個DataFrame。


舉例來說,我們的movie ratings這個DataFrame有979行:




我們可以使用sample()函數(shù)來隨機(jī)選取75%的行,并將它們賦值給'movies_1'DataFrame:




接著我們使用drop()函數(shù)來舍棄“moive_1”中出現(xiàn)過的行,將剩下的行賦值給'movies_2'DataFrame:




你可以發(fā)現(xiàn)總的行數(shù)是正確的:




你還可以檢查每部電影的索引,或者'moives_1':




或者'moives_2':




需要注意的是,這個方法在索引值不唯一的情況下不起作用。


注:該方法在機(jī)器學(xué)習(xí)或者深度學(xué)習(xí)中很有用,因為在模型訓(xùn)練前,我們往往需要將全部數(shù)據(jù)集按某個比例劃分成訓(xùn)練集和測試集。該方法既簡單又高效,值得學(xué)習(xí)和嘗試。


多種類型過濾DataFrame


讓我們先看一眼movies這個DataFrame:


In [60]:movies.head()
Out[60]:


中有一列是genre(類型):




比如我們想要對該DataFrame進(jìn)行過濾,我們只想顯示genre為Action或者Drama或者Western的電影,我們可以使用多個條件,以'or'符號分隔:


In [62]:movies[(movies.genre == 'Action') |       (movies.genre == 'Drama') |       (movies.genre == 'Western')].head()
Out[62]:


但是,你實際上可以使用isin()函數(shù)將代碼寫得更加清晰,將genres列表傳遞給該函數(shù):


In [63]:movies[movies.genre.isin(['Action', 'Drama', 'Western'])].head()
Out[63]:


如果你想要進(jìn)行相反的過濾,也就是你將吧剛才的三種類型的電影排除掉,那么你可以在過濾條件前加上破浪號:


In [64]:movies[~movies.genre.isin(['Action', 'Drama', 'Western'])].head()
Out[64]:


這種方法能夠起作用是因為在Python中,波浪號表示“not”操作。


DataFrame篩選數(shù)量最多類別


假設(shè)你想要對movies這個DataFrame通過genre進(jìn)行過濾,但是只需要前3個數(shù)量最多的genre。

我們對genre使用value_counts()函數(shù),并將它保存成counts(type為Series):




該Series的nlargest()函數(shù)能夠輕松地計算出Series中前3個最大值:




事實上我們在該Series中需要的是索引:




最后,我們將該索引傳遞給isin()函數(shù),該函數(shù)會把它當(dāng)成genre列表:


In [68]:movies[movies.genre.isin(counts.nlargest(3).index)].head()
Out[68]:


這樣,在DataFrame中只剩下Drame, Comdey, Action這三種類型的電影了。


處理缺失值


讓我們來看一看UFO sightings這個DataFrame:




你將會注意到有些值是缺失的。


為了找出每一列中有多少值是缺失的,你可以使用isna()函數(shù),然后再使用sum():




isna()會產(chǎn)生一個由True和False組成的DataFrame,sum()會將所有的True值轉(zhuǎn)換為1,F(xiàn)alse轉(zhuǎn)換為0并把它們加起來。

類似地,你可以通過mean()和isna()函數(shù)找出每一列中缺失值的百分比。




如果你想要舍棄那些包含了缺失值的列,你可以使用dropna()函數(shù):




或者你想要舍棄那么缺失值占比超過10%的列,你可以給dropna()設(shè)置一個閾值:




len(ufo)返回總行數(shù),我們將它乘以0.9,以告訴pandas保留那些至少90%的值不是缺失值的列。


一個字符串劃分成多列


我們先創(chuàng)建另一個新的示例DataFrame:




如果我們需要將“name”這一列劃分為三個獨立的列,用來表示first, middle, last name呢?我們將會使用str.split()函數(shù),告訴它以空格進(jìn)行分隔,并將結(jié)果擴(kuò)展成一個DataFrame:




這三列實際上可以通過一行代碼保存至原來的DataFrame:




如果我們想要劃分一個字符串,但是僅保留其中一個結(jié)果列呢?比如說,讓我們以', '來劃分location這一列:




如果我們只想保留第0列作為city name,我們僅需要選擇那一列并保存至DataFrame:



Series擴(kuò)展成DataFrame


讓我們創(chuàng)建一個新的示例DataFrame:



這里有兩列,第二列包含了Python中的由整數(shù)元素組成的列表。

如果我們想要將第二列擴(kuò)展成DataFrame,我們可以對那一列使用apply()函數(shù)并傳遞給Series constructor:




通過使用concat()函數(shù),我們可以將原來的DataFrame和新的DataFrame組合起來:



對多個函數(shù)進(jìn)行聚合


讓我們來看一眼從Chipotle restaurant chain得到的orders這個DataFrame:


In [82]:orders.head(10)
Out[82]:


每個訂單(order)都有訂單號(order_id),包含一行或者多行。為了找出每個訂單的總價格,你可以將那個訂單號的價格(item_price)加起來。比如,這里是訂單號為1的總價格:




如果你想要計算每個訂單的總價格,你可以對order_id使用groupby(),再對每個group的item_price進(jìn)行求和。




但是,事實上你不可能在聚合時僅使用一個函數(shù),比如sum()。為了對多個函數(shù)進(jìn)行聚合,你可以使用agg()函數(shù),傳給它一個函數(shù)列表,比如sum()和count():




這將告訴我們沒定訂單的總價格和數(shù)量。


聚合結(jié)果與DataFrame組合


讓我們再看一眼orders這個DataFrame:


In [86]:orders.head(10)
Out[86]:


如果我們想要增加新的一列,用于展示每個訂單的總價格呢?回憶一下,我們通過使用sum()函數(shù)得到了總價格:




sum()是一個聚合函數(shù),這表明它返回輸入數(shù)據(jù)的精簡版本(reduced version )。


換句話說,sum()函數(shù)的輸出:




比這個函數(shù)的輸入要?。?/span>




解決的辦法是使用transform()函數(shù),它會執(zhí)行相同的操作但是返回與輸入數(shù)據(jù)相同的形狀




我們將這個結(jié)果存儲至DataFrame中新的一列:


In [91]:orders['total_price'] = total_priceorders.head(10)
Out[91]:


你可以看到,每個訂單的總價格在每一行中顯示出來了。


這樣我們就能方便地甲酸每個訂單的價格占該訂單的總價格的百分比:


In [92]:orders['percent_of_total'] = orders.item_price / orders.total_priceorders.head(10)
In [92]:


選取行和列的切片


讓我們看一眼另一個數(shù)據(jù)集:


In [93]:titanic.head()
Out[93]:

這就是著名的Titanic數(shù)據(jù)集,它保存了Titanic上乘客的信息以及他們是否存活。


如果你想要對這個數(shù)據(jù)集做一個數(shù)值方面的總結(jié),你可以使用describe()函數(shù):




但是,這個DataFrame結(jié)果可能比你想要的信息顯示得更多。

如果你想對這個結(jié)果進(jìn)行過濾,只想顯示“五數(shù)概括法”(five-number summary)的信息,你可以使用loc函數(shù)并傳遞'min'到'max'的切片:




如果你不是對所有列都感興趣,你也可以傳遞列名的切片:



MultiIndexed Series重塑


Titanic數(shù)據(jù)集的Survived列由1和0組成,因此你可以對這一列計算總的存活率:




如果你想對某個類別,比如“Sex”,計算存活率,你可以使用groupby():




如果你想一次性對兩個類別變量計算存活率,你可以對這些類別變量使用groupby():




該結(jié)果展示了由Sex和Passenger Class聯(lián)合起來的存活率。它存儲為一個MultiIndexed Series,也就是說它對實際數(shù)據(jù)有多個索引層級。


這使得該數(shù)據(jù)難以讀取和交互,因此更為方便的是通過unstack()函數(shù)將MultiIndexed Series重塑成一個DataFrame:




該DataFrame包含了與MultiIndexed Series一樣的數(shù)據(jù),不同的是,現(xiàn)在你可以用熟悉的DataFrame的函數(shù)對它進(jìn)行操作。


創(chuàng)建數(shù)據(jù)透視表


如果你經(jīng)常使用上述的方法創(chuàng)建DataFrames,你也許會發(fā)現(xiàn)用pivot_table()函數(shù)更為便捷




想要使用數(shù)據(jù)透視表,你需要指定索引(index), 列名(columns), (values)和聚合函數(shù)(aggregation function)。


數(shù)據(jù)透視表的另一個好處是,你可以通過設(shè)置margins=True輕松地將行和列都加起來




這個結(jié)果既顯示了總的存活率,也顯示了Sex和Passenger Class的存活率。


最后,你可以創(chuàng)建交叉表(cross-tabulation),只需要將聚合函數(shù)由'mean'改為'count':



這個結(jié)果展示了每一對類別變量組合后的記錄總數(shù)。


連續(xù)數(shù)據(jù)轉(zhuǎn)類別數(shù)據(jù)


讓我們來看一下Titanic數(shù)據(jù)集中的Age那一列:




它現(xiàn)在是連續(xù)性數(shù)據(jù),但是如果我們想要將它轉(zhuǎn)變成類別數(shù)據(jù)呢?

一個解決辦法是對年齡范圍打標(biāo)簽,比如'adult', 'young adult', 'child'。實現(xiàn)該功能的最好方式是使用cut()函數(shù)




這會對每個值打上標(biāo)簽。0到18歲的打上標(biāo)簽'child',18-25歲的打上標(biāo)簽'young adult',25到99歲的打上標(biāo)簽“adult”。

注意到,該數(shù)據(jù)類型為類別變量,該類別變量自動排好序了(有序的類別變量)。


Style a DataFrame


上一個技巧在你想要修改整個jupyter notebook中的顯示會很有用。但是,一個更靈活和有用的方法是定義特定DataFrame中的格式化(style)。


讓我們回到stocks這個DataFrame:




我們可以創(chuàng)建一個格式化字符串的字典,用于對每一列進(jìn)行格式化。然后將其傳遞給DataFrame的style.format()函數(shù):




注意到,Date列是month-day-year的格式,Close列包含一個$符號,Volume列包含逗號。


我們可以通過鏈?zhǔn)秸{(diào)用函數(shù)來應(yīng)用更多的格式化:




我們現(xiàn)在隱藏了索引,將Close列中的最小值高亮成紅色,將Close列中的最大值高亮成淺綠色。


這里有另一個DataFrame格式化的例子:




Volume列現(xiàn)在有一個漸變的背景色,你可以輕松地識別出大的和小的數(shù)值。


最后一個例子:




現(xiàn)在,Volumn列上有一個條形圖,DataFrame上有一個標(biāo)題。

請注意,還有許多其他的選項你可以用來格式化DataFrame。


額外技巧


Profile a DataFrame


假設(shè)你拿到一個新的數(shù)據(jù)集,你不想要花費太多力氣,只是想快速地探索下。那么你可以使用pandas-profiling這個模塊。

在你的系統(tǒng)上安裝好該模塊,然后使用ProfileReport()函數(shù),傳遞的參數(shù)為任何一個DataFrame。它會返回一個互動的HTML報告:


  • 第一部分為該數(shù)據(jù)集的總覽,以及該數(shù)據(jù)集可能出現(xiàn)的問題列表

  • 第二部分為每一列的總結(jié)。你可以點擊'toggle details'獲取更多信息

  • 第三部分顯示列之間的關(guān)聯(lián)熱力圖

  • 第四部分為缺失值情況報告

  • 第五部分顯示該數(shù)據(jù)及的前幾行


使用示例如下(只顯示第一部分的報告):



End.

譯者:山陰少年

來源:博客園

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产麻豆精品福利在线| 久久国内午夜福利直播| 精品丝袜一区二区三区性色| 欧美成人黄色一区二区三区| 日韩毛片视频免费观看| 丰满少妇被粗大猛烈进出视频 | 欧美日韩一区二区三区色拉拉| 好吊妞视频只有这里有精品| 国产精品熟女乱色一区二区| 亚洲av日韩一区二区三区四区 | 高清一区二区三区大伊香蕉| 国产一区二区三区成人精品| 91亚洲精品亚洲国产| 一区二区日本一区二区欧美| 亚洲精品中文字幕欧美| 蜜桃传媒视频麻豆第一区| 亚洲国产91精品视频| 欧美一区二区三区五月婷婷| 深夜视频成人在线观看| 日本黄色美女日本黄色| 日本加勒比在线观看一区| 日本一二三区不卡免费| 国产精品流白浆无遮挡| 欧美日韩国产一级91| 欧美日韩在线视频一区| 日本特黄特色大片免费观看| 人妻乱近亲奸中文字幕| 亚洲综合精品天堂夜夜| 欧美不雅视频午夜福利| 日韩成人动画在线观看| 中国美女偷拍福利视频| 日本道播放一区二区三区| 日韩精品第一区二区三区| 久久精品国产99国产免费| 欧美日韩三区在线观看| 亚洲日本加勒比在线播放| 精品国产丝袜一区二区| 日韩精品在线观看完整版| 久久精品国产99国产免费| 99久久精品国产麻豆| 精品久久少妇激情视频|