首页 文章详情

用apply()函数对DataFrame对象进行批量操作

Python算法之旅 | 900 2022-01-12 18:47 0 0 0
UniSMS (合一短信)

说在前面

在上一篇文章《整体操作numpy数组的方法》中,我给大家介绍了整体操作numpy数组的一些常用方法和经典案例。
pandas基于numpy模块,其提供的Series和DataFrame数据结构都可以像numpy数组一样进行整体操作。直接调用pandas的内置方法批量处理数据,比自己编写循环语句遍历数组要方便快捷得多。
pandas模块中批量处理数组元素的常用函数为apply()。今天我就和大家一起分享apply()函数的特点和使用方法。

1.  apply()函数说明

pandas的apply()函数可以自动遍历整个Series或者DataFrame对象, 对每一个元素运行指定的函数。具体参数说明如下:

DataFrame.apply(funcaxis=0, raw=Falseargs=(), **kwds)

func表示要指定的函数,可以是内置函数或自定义函数,也可以是lambda表达式;axis规定了传入数据所在的轴向,默认为0,表示按列处理;1表示按行处理,即当axis=1时,会把一行数据以Series对象形式传入到func函数中,函数对Series对象进行相关处理后,返回一个结果;apply函数会自动遍历DataFrame对象的每一行或列,最后将所有结果组合成一个Series或DataFrame对象并返回。raw默认为 False,表示把每一行或列作为 Series 传入函数中。

 
2.  典型案例分析

例1.   处理所有的行或列。注意axis的值默认为0,表示按列处理。

df =pd.DataFrame(np.random.randint(-10, 10, (4,5)),columns=list('abcde'))# 求每列的最大值与最小值的差x =df.apply(lambda x:max(x)-min(x))# 求每行的最大值与最小值的差y =df.apply(lambda x:max(x)-min(x), axis=1)print(df)print(x)print(y)
输出结果如下所示:

 
例2.  处理部分行或列。如果只想apply()作用于指定的行和列,可以用行或者列的 name 属性进行限定。
df =pd.DataFrame(np.random.randint(-10, 10, (4,5)),columns=list('abcde'))# 求a、b两列自身值与平均值的差x = df.apply(lambda x : x-x.mean() if x.name in ['a', 'b'] else x)# 求第1行自身值与总和之比y = df.apply(lambda x : x/sum(x) if x.name==0 else x, axis=1)print(df)print(x)print(y)
输出结果如下所示:

 
例3.  可以将每一次的处理结果组成一个Series对象,最后所有的Series对象组合成一个DataFrame对象。
df =pd.DataFrame(np.random.randint(-10, 10, (4,5)),columns=list('abcde'))def f(x):    returnpd.Series([x.min(),x.max(),x.mean()],index=['min','max','mean'])d = df.apply(f)print(d)
输出结果如下所示:

 
例4.  可以对多列的值进行处理,并将返回值作为新列的数据。
df =pd.DataFrame(np.random.randint(-10, 10, (4,5)),columns=list('abcde'))def f(a, b, c):    return a + b + cdf['sum']  = df.apply(lambda x:f(x['b'],x['c'],x['d']),axis=1)print(df)
输出结果如下所示:

 
例5.  也可以使用*args或**kwds参数代替lambda。
df =pd.DataFrame(np.random.randint(-10, 10, (4,5)),columns=list('abcde'))def f(df, a, b, c):    return df[a] + df[b] +df[c]df['sum']  = df.apply(f,axis=1,args=('b','c','d'))print(df)df['sum']  =df.apply(f,axis=1,a='b',b='c',c='d')print(df)
输出结果如下所示:


3.  课后拓展练习 

计算体重指数。BMI指数(身体质量指数,又称体重指数,英文为Body Mass Index,简称BMI),是用体重(千克)除以身高(米)的平方得出的数字,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。

“身高体重数据.csv”文件中存储了初一学生的身高体重数据,请计算每位同学的体重指数(保留1位小数),并根据体重指数单项评分表分别计算男生和女生的等级和单项成绩,统计各类等级的学生人数。

请编写程序读取“身高体重数据.csv”文件数据到DataFrame对象df中,并根据题目要求对df做进一步处理,最终输出df和其他统计数据如下图所示:


需要本文源代码和word文稿的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。

我们专注Python算法,感兴趣就一起来!



相关优秀文章:

阅读代码和写更好的代码

最有效的学习方式

利用pandas模块处理学生成绩

利用pandas模块处理百家姓数据

整体操作numpy数组的方法


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter