pandas数据处理三大重要函数之apply、map与applymap

python数据分析集合:

1、python之Numpy知识点详细总结

2、python最最最重要的数据分析工具之pandas

3、pandas之表连接与高级查询

在这里插入图片描述

今天学习pandas中三大映射函数map()、apply()函数、applymap()函数及numpy中的np.where()函数,它们之间都有着类似的作用。

# 导入库
import pandas as pd
import numpy as np

1、Series.map()

map()的参数可以传入一个lambda表达式或者一个自定义函数;
结果输出的是Series;
针对的是DataFrame的某一行或某一列即Seies进行处理; Series.map()
df = pd.DataFrame({
    '姓名':['王一','李二','张三','赵四'],
    '性别':['男','女','男','女'],
    '班级':['一班','二班','一班','二班'],
    '分数':[89,99,76,67]
}) 
df2 = df.copy()  #拷贝一份,免得破坏原数据,后面也需要使用原数据
# 把性别男—女用1—0表示
# 创建函数:性别若是男返回1,若是nv返回0
def sex(x):
    if x == '男':
        return 1
    else:
        return 0
	# a、直接传入自定义函数进行映射匹配	 Series.map(函数名)		
# df2['性别'] = df2['性别'].map(sex)
	# b、传入lambda表达式 lambda 变量:函数 ; 
# 利用lambda的时候对函数需传参 如sex(参数)
#df2['性别'] = df2['性别'].map(lambda x:sex(x))
df2['性别'] = df2['性别'].map(lambda x:1 if x=='男' else 0) #三元表达式
df2

在这里插入图片描述

2、Series.apply(function,args=(函数的其他参数,))

- 与map函数类似,都有以下特点:
    - apply的参数可以传入一个lambda表达式或者一个自定义函数;
    - 结果输出的是Series;
    - 针对的是DataFrame的某一行或某一列即Series进行处理; Series.apply()
- 不同的是:
- apply可以传入更复杂的函数(多个参数),而map不可以
例子:现在我们想知道学生分数是高于平均分还是低于平均分,求出分数与平均分的差距。
从例子来看,我们需要传入两个参数:学生分数和平均分,map()只能输入一个参数,而apply可以输入多个参数。
df3 = df.copy()    
# 单个参数的话与map()函数完全一致
#df3['性别'] = df3['性别'].apply(lambda x: 1 if x == '男' else 0)
df3['性别'] = df3['性别'].apply(sex) 

# 传入两个参数:学生分数和平均分 
def score(x,avg):
    return x-avg
# apply(score,args=(平均分,)) 平均分可以用np.mean(df3['分数']) 或 df3['分数'].mean()
df3['分数差'] = df3['分数'].apply(score,args=(np.mean(df3['分数']),))
df3['平均分'] = df3['分数'].mean()  # 求平均分方面后边对比
df3

在这里插入图片描述

3、DataFrame.applymap()

applymap虽说是apply和map的结合,但其针对对象不同,它是针对dataframe的所有单元格进行操作的 即dataframe.applymap()
df4 = df.copy()
df4.applymap(sex)
# 从图中可以看出 该函数对表格所有值都进行了0—1转换

在这里插入图片描述

4、numpy.where()

np.where(条件,True返回值,False返回值)  
 	类似excel中的if()语句
 	对于Series和DataFrame都可以进行处理
	但输出的是数组
# 直接传入df3表, 针对的就是整张表格
np.where(df3=='男','1','0')  # 从结果看出,输出的是数组array类型 

在这里插入图片描述

df5 = df.copy()
# 传入的是某一列的话,其他值就不改变 
print(np.where(df5['班级']=='一班','class1','class2'))  # 数组
df5['班级'] = np.where(df5['班级']=='一班','class1','class2') # 在原数据上直接改变
df5

在这里插入图片描述

5、总结:apply、map、applymap、np.where的区别

函数说明
map(函数)传入自定义函数(不需要传参) 或 lambda表达式+函数(需要传参) 针对Series
apply(函数,args=(,))自定义函数只有一个参数时与map一样,有多个参数时,args就是传入其他参数的入口 针对Series
applymap(函数)与map和apply一致,只是针对的时DataFrame整张表所有数据
np.where(条件,True返回值,False返回值)与excel的if函数一样, 若条件为真,返回值1,不为真,返回值2

我觉得,这四个函数中,applymap函数使用频率不太高;最常用的是map和apply,单参数时选用map或apply,多参数时选用apply;np.where既可以针对Series也可以DataFrame,对于两个返回值的时候还是比较好用的,但多于两个返回值可能就麻烦点了吧。

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值