约定第一行代码

import pandas as pd

Apply–对行、列用函数处理

俗话说,工欲善其事,必先利其器。在这里形容apply函数再合适不过了,apply函数,可以说是pandas中自由度最高的函数。不过,是否能发挥其巨大威力,取决于我们的创造力

在本博文中,首先通过简单例子来说明apply的用法
然后通过俩个高级例子来演示常用的用法

1 简单例子来说明apply的用法

老样子,先创建一个DataFrame对象

df1=pd.DataFrame({'sex':list('FFMFMMF'),
                  'smoker':list('YNYYNYY'),
                  'age':[21,30,17,37,40,18,26],
                  'weight':[120,100,132,140,94,89,123]})
df1

代码结果

sexsmokerageweight
0FY21120
1FN30100
2MY17132
3FY37140
4MN4094
5MY1889
6FY26123
def bin_age(age):
    if age >=18:
        return 1
    else:
        return 0

df1['age'].apply(bin_age)

#可以使用llambda函数简化代码
df1['age'].apply(lambda x : 1 if x >18 else 0)

#代码结果
0    1
1    1
2    0
3    1
4    1
5    0
6    1
Name: age, dtype: int64

2 取出抽烟和不抽烟的体重前二

def top(df,col,n=5):
    return df.sort_values(by=col)[-n:]
df1.groupby('smoker').apply(top,col='weight',n=2)

代码结果
图1

  • df1对象根据:’smoker’列,groupby分组成抽烟和不抽烟二组
  • 然后每一组作为参数传进自定义的top函数,对于top函数的其余参数,在apply函数作为关键字参数即可
  • 对于自定义的top函数返回的DataFrame对象,将其所有返回的结果(在这是返回俩次)用concat连接,形成最终结果

3 根据性别、年龄求每个人的含水量

据科学数据表明:

婴儿含水量70%~80%

成年男性体内含水量 60%~65%

而成年女性体内含水量只是 50%~60%

(男人才是水做的

def water(one_row):
    #婴儿
    if one_row['age']==1:
        return one_row['weight']*0.7
    #成年男女
    if one_row['sex']=='M':
        return one_row['weight']*0.6
    else:
        return one_row['weight']*0.5

df1.apply(water,axis=1)

#代码结果
0    60.0
1    50.0
2    79.2
3    70.0
4    56.4
5    53.4
6    61.5
dtype: float64
  • 首先我们必须弄清楚,之前都是对列进行操作,而现在是求每一行,也就是每个人的含水量,即对行进行操作,故应用apply函数时axis=1
  • 而每一次应用自定义的water函数时,传进的一行是Series对象,每次返回单值,最终组合成Series对象

总结

  • 首先,我们要弄清操作的元素是行还是列,若对每一行进行apply,则axis=1
  • 其次,编写好apply应用的函数,注意传进的参数和返回值的类型是单值、Series或DataFrame

groupby 和 apply 组合,运用得当将会产生巨大的威力!


世界因代码而改变 Peace Out
世界因代码而改变 Peace Out
最后修改:2020 年 10 月 07 日 03 : 05 PM
如果觉得我的文章对你有用,请随意赞赏