99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀全文2500字,詳解Pandas與Lambda結(jié)合進(jìn)行高效數(shù)據(jù)分析
全文2500字,詳解Pandas與Lambda結(jié)合進(jìn)行高效數(shù)據(jù)分析
2021-12-22
收藏

作者:俊欣

來源:關(guān)于數(shù)據(jù)分析與可視化

今天小編打算稍微中規(guī)中矩一些,寫一篇技術(shù)類的干貨文章。

這篇文章小編來講講lambda方法以及它在pandas模塊當(dāng)中的運(yùn)用,熟練掌握可以極大地提高數(shù)據(jù)分析與挖掘的效率

導(dǎo)入模塊與讀取數(shù)據(jù)

我們第一步需要導(dǎo)入模塊以及數(shù)據(jù)集

import pandas as pd

df = pd.read_csv("IMDB-Movie-Data.csv")
df.head()

創(chuàng)建新的列

一般我們是通過在現(xiàn)有兩列的基礎(chǔ)上進(jìn)行一些簡單的數(shù)學(xué)運(yùn)算來創(chuàng)建新的一列,例如

df['AvgRating'] = (df['Rating'] + df['Metascore']/10)/2

但是如果要新創(chuàng)建的列是經(jīng)過相當(dāng)復(fù)雜的計(jì)算得來的,那么lambda方法就很多必要被運(yùn)用到了,我們先來定義一個函數(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

我們對于不同類別的電影采用了不同方式的評分方法,例如對于“驚悚片”,評分的方法則是在“原來的評分+1”和10分當(dāng)中取一個最小的,而對于“喜劇”類別的電影,則是在0分和“原來的評分-1”當(dāng)中取一個最大的,然后我們通過apply方法和lambda方法將這個自定義的函數(shù)應(yīng)用在這個DataFrame數(shù)據(jù)集當(dāng)中

df["CustomRating"] = df.apply(lambda x: custom_rating(x['Genre'], x['Rating']), axis = 1)

我們這里需要說明一下axis參數(shù)的作用,其中axis=1代表跨列而axis=0代表跨行,如下圖所示

全文2500字,詳解Pandas與Lambda結(jié)合進(jìn)行高效數(shù)據(jù)分析

篩選數(shù)據(jù)

pandas當(dāng)中篩選數(shù)據(jù)相對來說比較容易,可以用到& | ~這些操作符,代碼如下

# 單個條件,評分大于5分的 df_gt_5 = df[df['Rating']>5] # 多個條件: AND - 同時滿足評分高于5分并且投票大于100000的 And_df = df[(df['Rating']>5) & (df['Votes']>100000)] # 多個條件: OR - 滿足評分高于5分或者投票大于100000的 Or_df = df[(df['Rating']>5) | (df['Votes']>100000)] # 多個條件:NOT - 將滿足評分高于5分或者投票大于100000的數(shù)據(jù)排除掉 Not_df = df[~((df['Rating']>5) | (df['Votes']>100000))]

這些都是非常簡單并且是常見的例子,但是要是我們想要篩選出電影的影名長度大于5的部分,要是也采用上面的方式就會報(bào)錯

df[len(df['Title'].split(" "))>=5]

output

AttributeError: 'Series' object has no attribute 'split' 

這里我們還是采用applylambda相結(jié)合,來實(shí)現(xiàn)上面的功能

#創(chuàng)建一個新的列來存儲每一影片名的長度 df['num_words_title'] = df.apply(lambda x : len(x['Title'].split(" ")),axis=1) #篩選出影片名長度大于5的部分 new_df = df[df['num_words_title']>=5]

當(dāng)然要是大家覺得上面的方法有點(diǎn)繁瑣的話,也可以一步到位

new_df = df[df.apply(lambda x : len(x['Title'].split(" "))>=5,axis=1)]

例如我們想要篩選出那些影片的票房低于當(dāng)年平均水平的數(shù)據(jù),可以這么來做。

我們先要對每年票房的的平均值做一個歸總,代碼如下

year_revenue_dict = df.groupby(['Year']).agg({'Revenue(Millions)':np.mean}).to_dict()['Revenue(Millions)']

然后我們定義一個函數(shù)來判斷是否存在該影片的票房低于當(dāng)年平均水平的情況,返回的是布爾值

def bool_provider(revenue, year): return revenue

然后我們通過結(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ù)的時候,主要是用.loc方法,它同時也可以和lambda方法聯(lián)用,例如我們想要篩選出評分在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方法來實(shí)現(xiàn)的,例如我們將“Price”這一列的數(shù)據(jù)類型轉(zhuǎn)變成整型的數(shù)據(jù),代碼如下

df['Price'].astype('int')

會出現(xiàn)如下所示的報(bào)錯信息

ValueError: invalid literal for int() with base 10: '12,000' 

因此當(dāng)出現(xiàn)類似“12,000”的數(shù)據(jù)的時候,調(diào)用astype方法實(shí)現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換就會報(bào)錯,因此我們還需要將到applylambda結(jié)合進(jìn)行數(shù)據(jù)的清洗,代碼如下

df['Price'] = df.apply(lambda x: int(x['Price'].replace(',', '')),axis=1)

方法調(diào)用過程的可視化

有時候我們在處理數(shù)據(jù)集比較大的時候,調(diào)用函數(shù)方法需要比較長的時間,這個時候就需要有一個要是有一個進(jìn)度條,時時刻刻向我們展示數(shù)據(jù)處理的進(jìn)度,就會直觀很多了。

這里用到的是tqdm模塊,我們將其導(dǎo)入進(jìn)來

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

全文2500字,詳解Pandas與Lambda結(jié)合進(jìn)行高效數(shù)據(jù)分析

當(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)然很多時候我們可能有多組if-else,這樣寫起來就有點(diǎn)麻煩了,代碼如下

df['Rating'].apply(lambda x:"低分電影" if x < 3 else ("中等電影" if x>=3 and x < 5 else("高分電影" if x>=8 else "值得觀看")))

看上去稍微有點(diǎn)凌亂了,這個時候,小編這里到還是推薦大家自定義函數(shù),然后通過applylambda方法搭配使用

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }