日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

全文2500字 详解Pandas与Lambda结合进行高效数据分析

發布時間:2024/9/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全文2500字 详解Pandas与Lambda结合进行高效数据分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

導入模塊與讀取數據

我們第一步需要導入模塊以及數據集

import?pandas?as?pddf?=?pd.read_csv("IMDB-Movie-Data.csv") df.head()

創建新的列

一般我們是通過在現有兩列的基礎上進行一些簡單的數學運算來創建新的一列,例如

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

但是如果要新創建的列是經過相當復雜的計算得來的,那么lambda方法就很多必要被運用到了,我們先來定義一個函數方法

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分當中取一個最小的,而對于“喜劇”類別的電影,則是在0分和“原來的評分-1”當中取一個最大的,然后我們通過apply方法和lambda方法將這個自定義的函數應用在這個DataFrame數據集當中

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

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

篩選數據

在pandas當中篩選數據相對來說比較容易,可以用到& | ~這些操作符,代碼如下

#?單個條件,評分大于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的數據排除掉 Not_df?=?df[~((df['Rating']>5)?|?(df['Votes']>100000))]

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

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

output

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

這里我們還是采用apply和lambda相結合,來實現上面的功能

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

當然要是大家覺得上面的方法有點繁瑣的話,也可以一步到位

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

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

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

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

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

def?bool_provider(revenue,?year):return?revenue<year_revenue_dict[year]

然后我們通過結合apply方法和lambda方法應用到數據集當中去

new_df?=?df[df.apply(lambda?x?:?bool_provider(x['Revenue(Millions)'],x['Year']),axis=1)]

我們篩選數據的時候,主要是用.loc方法,它同時也可以和lambda方法聯用,例如我們想要篩選出評分在5-8分之間的電影以及它們的票房,代碼如下

df.loc[lambda?x:?(x["Rating"]?>?5)?&?(x["Rating"]?<?8)][["Title",?"Revenue?(Millions)"]]

轉變指定列的數據類型

通常我們轉變指定列的數據類型,都是調用astype方法來實現的,例如我們將“Price”這一列的數據類型轉變成整型的數據,代碼如下

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

會出現如下所示的報錯信息

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

因此當出現類似“12,000”的數據的時候,調用astype方法實現數據類型轉換就會報錯,因此我們還需要將到apply和lambda結合進行數據的清洗,代碼如下

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

方法調用過程的可視化

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

這里用到的是tqdm模塊,我們將其導入進來

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

當lambda方法遇到if-else

當然我們也可以將if-else運用在lambda自定義函數當中,代碼如下

Bigger?=?lambda?x,?y?:?x?if(x?>?y)?else?y Bigger(2,?10)

output

10

當然很多時候我們可能有多組if-else,這樣寫起來就有點麻煩了,代碼如下

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

看上去稍微有點凌亂了,這個時候,小編這里到還是推薦大家自定義函數,然后通過apply和lambda方法搭配使用

各位伙伴們好,詹帥本帥搭建了一個個人博客和小程序,匯集各種干貨和資源,也方便大家閱讀,感興趣的小伙伴請移步小程序體驗一下哦!(歡迎提建議)

推薦閱讀

牛逼!Python常用數據類型的基本操作(長文系列第①篇)

牛逼!Python的判斷、循環和各種表達式(長文系列第②篇)

牛逼!Python函數和文件操作(長文系列第③篇)

牛逼!Python錯誤、異常和模塊(長文系列第④篇)

總結

以上是生活随笔為你收集整理的全文2500字 详解Pandas与Lambda结合进行高效数据分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。