kaiyun.com 详解 Pandas 与 Lambda 蚁合进行高效数据分析

发布日期:2023-12-09 12:02    点击次数:104


 kaiyun.com[[441859]]kaiyun.com

这篇著述小编来讲讲lambda才调以及它在pandas模块当中的愚弄,闇练掌捏不错极地面擢升数据分析与挖掘的截至。

导入模块与读取数据

咱们第一步需要导入模块以及数据集: 

import pandas as pd  df = 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分的  dfdf_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才调搭配使用。

 






栏目分类

热点资讯

相关资讯