全文2500字 详解Pandas与Lambda结合进行高效数据分析
這篇文章小編來(lái)講講lambda方法以及它在pandas模塊當(dāng)中的運(yùn)用,熟練掌握可以極大地提高數(shù)據(jù)分析與挖掘的效率
導(dǎo)入模塊與讀取數(shù)據(jù)
我們第一步需要導(dǎo)入模塊以及數(shù)據(jù)集
import?pandas?as?pddf?=?pd.read_csv("IMDB-Movie-Data.csv") df.head()創(chuàng)建新的列
一般我們是通過(guò)在現(xiàn)有兩列的基礎(chǔ)上進(jìn)行一些簡(jiǎn)單的數(shù)學(xué)運(yùn)算來(lái)創(chuàng)建新的一列,例如
df['AvgRating']?=?(df['Rating']?+?df['Metascore']/10)/2但是如果要新創(chuàng)建的列是經(jīng)過(guò)相當(dāng)復(fù)雜的計(jì)算得來(lái)的,那么lambda方法就很多必要被運(yùn)用到了,我們先來(lái)定義一個(gè)函數(shù)方法
def?custom_rating(genre,rating):if?'Thriller'?in?genre:return?min(10,rating+1)elif?'Comedy'?in?genre:return?max(0,rating-1)elif?'Drama'?in?genre:return?max(5,?rating-1)else:return?rating我們對(duì)于不同類別的電影采用了不同方式的評(píng)分方法,例如對(duì)于“驚悚片”,評(píng)分的方法則是在“原來(lái)的評(píng)分+1”和10分當(dāng)中取一個(gè)最小的,而對(duì)于“喜劇”類別的電影,則是在0分和“原來(lái)的評(píng)分-1”當(dāng)中取一個(gè)最大的,然后我們通過(guò)apply方法和lambda方法將這個(gè)自定義的函數(shù)應(yīng)用在這個(gè)DataFrame數(shù)據(jù)集當(dāng)中
df["CustomRating"]?=?df.apply(lambda?x:?custom_rating(x['Genre'],?x['Rating']),?axis?=?1)我們這里需要說(shuō)明一下axis參數(shù)的作用,其中axis=1代表跨列而axis=0代表跨行,如下圖所示
篩選數(shù)據(jù)
在pandas當(dāng)中篩選數(shù)據(jù)相對(duì)來(lái)說(shuō)比較容易,可以用到& | ~這些操作符,代碼如下
#?單個(gè)條件,評(píng)分大于5分的 df_gt_5?=?df[df['Rating']>5]#?多個(gè)條件:?AND?-?同時(shí)滿足評(píng)分高于5分并且投票大于100000的 And_df?=?df[(df['Rating']>5)?&?(df['Votes']>100000)]#?多個(gè)條件:?OR?-?滿足評(píng)分高于5分或者投票大于100000的 Or_df?=?df[(df['Rating']>5)?|?(df['Votes']>100000)]#?多個(gè)條件:NOT -?將滿足評(píng)分高于5分或者投票大于100000的數(shù)據(jù)排除掉 Not_df?=?df[~((df['Rating']>5)?|?(df['Votes']>100000))]這些都是非常簡(jiǎn)單并且是常見(jiàn)的例子,但是要是我們想要篩選出電影的影名長(zhǎng)度大于5的部分,要是也采用上面的方式就會(huì)報(bào)錯(cuò)
df[len(df['Title'].split("?"))>=5]output
AttributeError:?'Series'?object?has?no?attribute?'split'這里我們還是采用apply和lambda相結(jié)合,來(lái)實(shí)現(xiàn)上面的功能
#創(chuàng)建一個(gè)新的列來(lái)存儲(chǔ)每一影片名的長(zhǎng)度 df['num_words_title']?=?df.apply(lambda?x?:?len(x['Title'].split("?")),axis=1)#篩選出影片名長(zhǎng)度大于5的部分 new_df?=?df[df['num_words_title']>=5]當(dāng)然要是大家覺(jué)得上面的方法有點(diǎn)繁瑣的話,也可以一步到位
new_df?=?df[df.apply(lambda?x?:?len(x['Title'].split("?"))>=5,axis=1)]例如我們想要篩選出那些影片的票房低于當(dāng)年平均水平的數(shù)據(jù),可以這么來(lái)做。
我們先要對(duì)每年票房的的平均值做一個(gè)歸總,代碼如下
year_revenue_dict?=?df.groupby(['Year']).agg({'Revenue(Millions)':np.mean}).to_dict()['Revenue(Millions)']然后我們定義一個(gè)函數(shù)來(lái)判斷是否存在該影片的票房低于當(dāng)年平均水平的情況,返回的是布爾值
def?bool_provider(revenue,?year):return?revenue<year_revenue_dict[year]然后我們通過(guò)結(jié)合apply方法和lambda方法應(yīng)用到數(shù)據(jù)集當(dāng)中去
new_df?=?df[df.apply(lambda?x?:?bool_provider(x['Revenue(Millions)'],x['Year']),axis=1)]我們篩選數(shù)據(jù)的時(shí)候,主要是用.loc方法,它同時(shí)也可以和lambda方法聯(lián)用,例如我們想要篩選出評(píng)分在5-8分之間的電影以及它們的票房,代碼如下
df.loc[lambda?x:?(x["Rating"]?>?5)?&?(x["Rating"]?<?8)][["Title",?"Revenue?(Millions)"]]轉(zhuǎn)變指定列的數(shù)據(jù)類型
通常我們轉(zhuǎn)變指定列的數(shù)據(jù)類型,都是調(diào)用astype方法來(lái)實(shí)現(xiàn)的,例如我們將“Price”這一列的數(shù)據(jù)類型轉(zhuǎn)變成整型的數(shù)據(jù),代碼如下
df['Price'].astype('int')會(huì)出現(xiàn)如下所示的報(bào)錯(cuò)信息
ValueError:?invalid?literal?for?int()?with?base?10:?'12,000'因此當(dāng)出現(xiàn)類似“12,000”的數(shù)據(jù)的時(shí)候,調(diào)用astype方法實(shí)現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換就會(huì)報(bào)錯(cuò),因此我們還需要將到apply和lambda結(jié)合進(jìn)行數(shù)據(jù)的清洗,代碼如下
df['Price']?=?df.apply(lambda?x:?int(x['Price'].replace(',',?'')),axis=1)方法調(diào)用過(guò)程的可視化
有時(shí)候我們?cè)谔幚頂?shù)據(jù)集比較大的時(shí)候,調(diào)用函數(shù)方法需要比較長(zhǎng)的時(shí)間,這個(gè)時(shí)候就需要有一個(gè)要是有一個(gè)進(jìn)度條,時(shí)時(shí)刻刻向我們展示數(shù)據(jù)處理的進(jìn)度,就會(huì)直觀很多了。
這里用到的是tqdm模塊,我們將其導(dǎo)入進(jìn)來(lái)
from?tqdm?import?tqdm,?tqdm_notebook tqdm_notebook().pandas()然后將apply方法替換成progress_apply即可,代碼如下
df["CustomRating"]?=?df.progress_apply(lambda?x:?custom_rating(x['Genre'],x['Rating']),axis=1)output
當(dāng)lambda方法遇到if-else
當(dāng)然我們也可以將if-else運(yùn)用在lambda自定義函數(shù)當(dāng)中,代碼如下
Bigger?=?lambda?x,?y?:?x?if(x?>?y)?else?y Bigger(2,?10)output
10當(dāng)然很多時(shí)候我們可能有多組if-else,這樣寫起來(lái)就有點(diǎn)麻煩了,代碼如下
df['Rating'].apply(lambda?x:"低分電影"?if?x?<?3?else?("中等電影"?if?x>=3?and?x?<?5?else("高分電影"?if?x>=8?else?"值得觀看")))看上去稍微有點(diǎn)凌亂了,這個(gè)時(shí)候,小編這里到還是推薦大家自定義函數(shù),然后通過(guò)apply和lambda方法搭配使用
各位伙伴們好,詹帥本帥搭建了一個(gè)個(gè)人博客和小程序,匯集各種干貨和資源,也方便大家閱讀,感興趣的小伙伴請(qǐng)移步小程序體驗(yàn)一下哦!(歡迎提建議)
推薦閱讀
牛逼!Python常用數(shù)據(jù)類型的基本操作(長(zhǎng)文系列第①篇)
牛逼!Python的判斷、循環(huán)和各種表達(dá)式(長(zhǎng)文系列第②篇)
牛逼!Python函數(shù)和文件操作(長(zhǎng)文系列第③篇)
牛逼!Python錯(cuò)誤、異常和模塊(長(zhǎng)文系列第④篇)
總結(jié)
以上是生活随笔為你收集整理的全文2500字 详解Pandas与Lambda结合进行高效数据分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 25个好用到爆的一行Python代码,建
- 下一篇: 向xxxhub发了一个数据包,发现了··