偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

 [[441859]]

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

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

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

  1. import pandas as pd  
  2. df = pd.read_csv("IMDB-Movie-Data.csv")  
  3. df.head() 

創(chuàng)建新的列

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

  1. 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ù)方法。 

  1. def custom_rating(genre,rating):  
  2.     if 'Thriller' in genre:  
  3.         return min(10,rating+1)  
  4.     elif 'Comedy' in genre:  
  5.         return max(0,rating-1)  
  6.     elif 'Drama' in genre:  
  7.         return max(5, rating-1)  
  8.     else:  
  9.         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)中。 

  1. 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ō)比較容易,可以用到& | ~這些操作符,代碼如下: 

  1. # 單個(gè)條件,評(píng)分大于5分的  
  2. dfdf_gt_5 = df[df['Rating']>5]  
  3. # 多個(gè)條件: AND - 同時(shí)滿足評(píng)分高于5分并且投票大于100000的  
  4. And_df = df[(df['Rating']>5) & (df['Votes']>100000)]  
  5. # 多個(gè)條件: OR - 滿足評(píng)分高于5分或者投票大于100000的  
  6. Or_df = df[(df['Rating']>5) | (df['Votes']>100000)]  
  7. # 多個(gè)條件:NOT - 將滿足評(píng)分高于5分或者投票大于100000的數(shù)據(jù)排除掉  
  8. Not_df = df[~((df['Rating']>5) | (df['Votes']>100000))] 

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

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

output 

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

這里我們還是采用apply和lambda相結(jié)合,來(lái)實(shí)現(xiàn)上面的功能。 

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

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

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

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

我們先要對(duì)每年票房的的平均值做一個(gè)歸總,代碼如下:

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

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

  1. def bool_provider(revenue, year):  
  2.     return revenue<year_revenue_dict[year] 

然后我們通過(guò)結(jié)合apply方法和lambda方法應(yīng)用到數(shù)據(jù)集當(dāng)中去 。

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

我們篩選數(shù)據(jù)的時(shí)候,主要是用.loc方法,它同時(shí)也可以和lambda方法聯(lián)用,例如我們想要篩選出評(píng)分在5-8分之間的電影以及它們的票房,代碼如下: 

  1. 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ù),代碼如下: 

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

會(huì)出現(xiàn)如下所示的報(bào)錯(cuò)信息:

  1. 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ù)的清洗,代碼如下: 

  1. 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):

  1. from tqdm import tqdm, tqdm_notebook  
  2. tqdm_notebook().pandas() 

然后將apply方法替換成progress_apply即可,代碼如下: 

  1. 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)中,代碼如下:

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

output

  1. 10 

當(dāng)然很多時(shí)候我們可能有多組if-else,這樣寫起來(lái)就有點(diǎn)麻煩了,代碼如下:

  1. 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方法搭配使用。

 

責(zé)任編輯:龐桂玉 來(lái)源: AI科技大本營(yíng)
相關(guān)推薦

2021-07-07 09:50:23

NumpyPandasPython

2022-07-08 06:01:37

D-Tale輔助工具

2023-12-10 14:06:04

數(shù)據(jù)庫(kù)pythonduckdb

2020-06-05 14:29:07

PythonPandas數(shù)據(jù)分析

2020-03-19 15:11:14

Pandas數(shù)據(jù)分析代碼

2025-06-06 08:35:41

2025-04-16 08:10:00

PandasPython數(shù)據(jù)分析

2023-11-21 09:11:31

2024-01-09 13:58:22

PandasPython數(shù)據(jù)分析

2021-12-13 19:40:53

物聯(lián)網(wǎng)數(shù)據(jù)分析IOT

2023-10-04 00:17:00

SQL數(shù)據(jù)庫(kù)

2023-05-26 00:28:33

PandasAIChatGPTOpenAI

2015-08-14 10:28:09

大數(shù)據(jù)

2022-11-11 11:35:14

2012-03-16 13:12:06

2022-04-02 06:20:48

IT領(lǐng)導(dǎo)者數(shù)據(jù)分析團(tuán)隊(duì)

2022-11-14 10:36:55

數(shù)據(jù)科學(xué)數(shù)據(jù)分析

2014-03-19 13:50:53

大數(shù)據(jù)分析云技術(shù)

2019-11-04 15:00:01

DatatableR語(yǔ)言數(shù)據(jù)科學(xué)

2014-01-22 15:34:00

數(shù)據(jù)分析
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)