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
Python网络爬虫出现乱码问题的解决方法
Jan 05 Python
Python对象类型及其运算方法(详解)
Jul 05 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
在CMD命令行中运行python脚本的方法
May 12 Python
python生成多个只含0,1元素的随机数组或列表的实例
Nov 12 Python
Python使用修饰器进行异常日志记录操作示例
Mar 19 Python
python匿名函数lambda原理及实例解析
Feb 07 Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 Python
如何在Django中使用聚合的实现示例
Mar 23 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
Python字典取键、值对的方法步骤
Sep 30 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
PHP 和 MySQL 基础教程(二)
2006/10/09 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
php采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
python实现人机五子棋
2020/03/25 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
servlet面试题
2012/08/20 面试题
本科生详细的自我评价
2013/09/19 职场文书
会计专业的自荐信
2013/12/12 职场文书
大学四年职业生涯规划书范文
2014/01/02 职场文书
研究生毕业自我鉴定范文
2014/03/27 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
电工实训心得体会
2016/01/14 职场文书
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
JS实现九宫格拼图游戏
2022/06/28 Javascript