pandas apply执行函数3点注意
import pandas as pd
data=pd.DataFrame({'name':['张三','李四','王五'],'age':[18,19,20],'number':[190,200,220]})
print(data)
#
name age number
0 张三 18 190
1 李四 19 200
2 王五 20 220
使用apply可以将df中指定的列全部执行该函数并返回结果
需要注意的有3点:
1.函数传入的执行对象
要对df中的某列执行函数,那函数执行的对象自然是该列,但是函数怎么知道是该列的数据呢。
apply默认对第一个参数视为传入的该列的值。所以定义函数时,随便加一个参数就可以了,然后在函数内部使用该参数进行计算。
def improve(num): #让该列每个值-100
return num-100
2.函数带多个参数
apply传入的参数是函数名称,如果函数带多个参数怎么办?apply给了一个args这个关键字参数,后面接一个元组,把需要传入的参数加进去,此时传入的元组不用算第一个参数,这也是一般常见的传参模式,类似Threading一样。
def improve(num,b):
return num-100+b
data['number'].apply(improve,args=(10,))
3.函数执行后的结果
执行apply后是有返回值的,返回的是传入数据的计算结果而不是原数据 ,既然有返回值,那么对于python语法一般是原数据不会被更改的,所以如果指定某列apply执行函数后,我们常见的写法有两种:
一种是在原数据新增一列,把该结果加进去:(强烈推荐,因为万一算错误了不需要重来,而且可以对比结果)
data['new_number']=data['number'].apply(improve,args=(10,))
print(data)
#
name age number new_number
0 张三 18 190 100
1 李四 19 200 110
2 王五 20 220 130
还有一种是将计算后的结果重新覆盖原列 (不推荐)
data['number']=data['number'].apply(improve,args=(10,))
print(data)
#
name age number
0 张三 18 100
1 李四 19 110
2 王五 20 130
完整代码:
import pandas as pd
data=pd.DataFrame({'name':['张三','李四','王五'],'age':[18,19,20],'number':[190,200,220]})
print(data)
def improve(num,b):
return num-100+b
data['new_number']=data['number'].apply(improve,args=(10,))
#data['number']=data['number'].apply(improve,args=(10,))
print(data)