pandas lambda函数,pandas 组合
大家好,在之前的文章中,我们介绍了很多Python的用法。喜欢的朋友可以看看历史文章。今天,我要告诉你如何与熊猫模块一起使用lambda。熟练掌握它可以大大提高数据分析和挖掘的效率。
导入模块与读取数据
第一步是导入模块和数据集。
进口熊猫作为pd
df=PD . read _ CSV( IMD b-Movie-data . CSV )
df.head()
创建新的列
通常,我们通过在现有的两列的基础上做一些简单的数学运算来创建一个新列,例如
df[ AvgRating ]=(df[ Rating ]df[ Metascore ]/10)/2
然而,如果要新创建的列是通过非常复杂的计算获得的,则必须应用lambda方法。我们先定义一个函数方法。
def custom_rating(流派,分级):
如果“颤栗”在genre:
返回最小值(10,等级1)
在genre:中的elif“喜剧”
最大回报(0,评分-1)
在genre:中的elif“戏剧”
最大回报(5,评分-1)
else:
回报评级
我们对不同类型的电影使用不同的评分方法。比如对于《惊悚片》来说,评分方法就是在“原评分1”和“10”之间选择最小的评分,而对于“喜剧”电影来说,就是在0和“原评分-1”之间选择最大的评分。然后,我们通过apply方法和lambda方法将这个自定义函数应用于这个DataFrame数据集。
df[ custom Rating ]=df . apply(lambda x : custom _ Rating(x[ Genre ],x[Rating]),axis=1)
这里需要说明一下axis参数的作用,其中axis=1表示跨列,axis=0表示跨行,如下图所示。
筛选数据
熊猫的数据筛选相对容易。您可以将这些运算符与下列代码一起使用。
#单项条件,得分大于5分
df_gt_5=df[df[评级]5]
#多个条件3360 and-得分高于5,票数大于100000的同时满足。
and _ df=df[(df[ Rating ]5)(df[ Votes ]100000)]
#多个条件3360 or-满足评分高于5分或投票大于10万。
or _ df=df[(df[ Rating ]5)(df[ Votes ]100000)]
#多个条件:不排除满足评分高于5或投票大于10万的数据。
not _ df=df[~((df[ Rating ]5)(df[ Votes ]100000))]
这些都是很简单很常见的例子,但是如果我们要筛选出电影名字长于5的那部分电影,如果我们也使用上面的方法就会报错。
df[len(df[Title]。split()=5]
输出
attribute error :“Series”对象没有属性“split”
在这里,我们仍然使用apply和lambda的组合来实现上述功能。
#创建一个新列来存储每个电影名称的长度
df[数字_单词_标题]=df.apply(lambda x : len(x[标题])。拆分(“”),轴=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
方法搭配使用。
到此这篇关于Pandas搭配lambda组合使用详解的文章就介绍到这了,更多相关Python Pandas 内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。