约定第一行代码
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
代码结果
sex | smoker | age | weight | |
---|---|---|---|---|
0 | F | Y | 21 | 120 |
1 | F | N | 30 | 100 |
2 | M | Y | 17 | 132 |
3 | F | Y | 37 | 140 |
4 | M | N | 40 | 94 |
5 | M | Y | 18 | 89 |
6 | F | Y | 26 | 123 |
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)
代码结果
- 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 组合,运用得当将会产生巨大的威力!