用apply()函数对DataFrame对象进行批量操作
共 2537字,需浏览 6分钟
·
2022-01-12 18:47
说在前面
pandas的apply()函数可以自动遍历整个Series或者DataFrame对象, 对每一个元素运行指定的函数。具体参数说明如下:
DataFrame.apply(func, axis=0, raw=False, args=(), **kwds)
func表示要指定的函数,可以是内置函数或自定义函数,也可以是lambda表达式;axis规定了传入数据所在的轴向,默认为0,表示按列处理;1表示按行处理,即当axis=1时,会把一行数据以Series对象形式传入到func函数中,函数对Series对象进行相关处理后,返回一个结果;apply函数会自动遍历DataFrame对象的每一行或列,最后将所有结果组合成一个Series或DataFrame对象并返回。raw默认为 False,表示把每一行或列作为 Series 传入函数中。
例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)
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)
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)
df =pd.DataFrame(np.random.randint(-10, 10, (4,5)),columns=list('abcde'))
def f(a, b, c):
return a + b + c
df['sum'] = df.apply(lambda x:f(x['b'],x['c'],x['d']),axis=1)
print(df)
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”文件数据到DataFrame对象df中,并根据题目要求对df做进一步处理,最终输出df和其他统计数据如下图所示:
需要本文源代码和word文稿的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,“Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。
我们专注Python算法,感兴趣就一起来!
相关优秀文章: