Pandas搭配lambda组合使用详解


Posted in Python onJanuary 22, 2022

导入模块与读取数据

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

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搭配lambda组合使用详解

筛选数据

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'

这里我们还是采用applylambda相结合,来实现上面的功能

#创建一个新的列来存储每一影片名的长度
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方法实现数据类型转换就会报错,因此我们还需要将到applylambda结合进行数据的清洗,代码如下

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

Pandas搭配lambda组合使用详解

当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 "值得观看")))

看上去稍微有点凌乱了,这个时候,小编这里到还是推荐大家自定义函数,然后通过applylambda方法搭配使用。

到此这篇关于Pandas搭配lambda组合使用详解的文章就介绍到这了,更多相关Python Pandas 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python将字符串转换成数组的方法
Apr 29 Python
Python3处理文件中每个词的方法
May 22 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
Pycharm设置界面全黑的方法
May 23 Python
django+tornado实现实时查看远程日志的方法
Aug 12 Python
python爬虫爬取幽默笑话网站
Oct 24 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
python数据分析:关键字提取方式
Feb 24 Python
解决Opencv+Python cv2.imshow闪退问题
Apr 24 Python
pandas apply使用多列计算生成新的列实现示例
Feb 24 Python
pandas数值排序的实现实例
Jul 25 Python
Python中的tkinter库简单案例详解
Jan 22 #Python
解析python中的jsonpath 提取器
Jan 18 #Python
Python中如何处理常见报错
Jan 18 #Python
Python机器学习应用之工业蒸汽数据分析篇详解
用Python可视化新冠疫情数据
Python机器学习应用之基于线性判别模型的分类篇详解
68行Python代码实现带难度升级的贪吃蛇
Jan 18 #Python
You might like
解决中英文字符串长度问题函数
2007/01/16 PHP
PHP伪静态写法附代码
2008/06/20 PHP
php下连接mssql2005的代码
2011/01/17 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
PHP7 新增功能
2021/03/09 PHP
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
js实现点击获取验证码倒计时效果
2021/01/28 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
Python的垃圾回收机制详解
2019/08/28 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
html5实现移动端适配完美写法
2017/11/16 HTML / CSS
美术兴趣小组活动总结
2014/07/07 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
师德师风个人总结
2015/02/06 职场文书
家属联谊会致辞
2015/07/31 职场文书
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
python数据可视化使用pyfinance分析证券收益示例详解
2021/11/20 Python
Python装饰器详细介绍
2022/03/25 Python