一、.apply()
如果是对series,则对series里的各值分别施加一个函数。第一个参数是函数对象,然后用关键字参数指定 args = (a,b)等,如
a = [[6,21,1.11],[ 8, 22, 1.22], [12, 23,1.33]] # 新建一个dataframe
a = pd.DataFrame(a,columns=['age','weight','height'])
print(a)
age weight height
0 6 21 1.11
1 8 22 1.22
2 12 23 1.33
定义一个判断并修改年龄的函数
def new_age (age, max,min): # 如果年龄大于10就修改为10
if age> max: age = 10 # 如果年龄小于5就修改为5
if age < min: age = 5
return age
再对dataframe的age列调用,注意调用的是series。第一个参数是函数对象,之后使用关键字agrs和kargs传参,否则会报错
b = a.iloc[:,0].apply(new_age, args = (9,7)) # 对serise使用apply
print (b)
0 5
1 8
2 10
也可以使用lamda(),类似.map(),就这个例子来说多个if判断肯定比lamda方便多了
如果是对dataframe,会挨个传入各行/各列,再施加一个函数,如计算BMI,为体重/(身高的平方),定义如下函数
age weight height
0 6 21 1.11
1 8 22 1.22
2 12 23 1.33
def bmi(se):
a = se['weight'] / se['height']**2
return a
a['bmi'] = a.apply(bmi ,axis=1) # 新增bmi列
print(a)
apply的第一个参数仍是函数对象,axis=1指定按行传入各series,列名不变,默认axis=0按列
结果是
age weight height bmi
0 6 21 1.11 17.044071
1 8 22 1.22 14.780973
2 12 23 1.33 13.002431
二、.map()
这个.map()不是python自带的map(func(), iterable),用于迭代对象的。而是用于映射(譬如把性别这一列的男替换成1,女替换为0)或函数变换,映射既可以用字典也可以用定义函数,变换则跟apply一样施加一个函数,比如lamda
a = [['小明','男',18],['小王','女',20]]
a = pd.DataFrame(a,columns=['名字','性别','年龄'])
print(a)
名字 性别 年龄
0 小明 男 18
1 小王 女 20
传回一个series,直接直接传字典,也可以传入定义的函数但只能有一个参数,或者lamda
print(a['性别'].map({'男':1,'女':0})) # 传入字典,可以直接写在map参数里
0 1
1 0
def new_sex(x): # 传入函数
return 1 if x == '男' else 0
print(a['性别'].map(new_sex))
三、.applymap()
结合了apply和map的特性,apply无法直接对dataframe的每个数据,map只能对series,而applymap可以直接对df的每个元素。例如对每个元素加一,直接用lamda
age weight height
0 6 21 1.11
1 8 22 1.22
2 12 23 1.33
print(a)
print(a.applymap(lambda x:x-1))
age weight height
0 5 20 0.11
1 7 21 0.22
2 11 22 0.33
总结:
apply功能最强大,即可对series(此时挨个处理元素)也可对dataframe(此时挨个处理series),参数可以传多个;map主要用于映射;而applymap可以直接对dataframe的每个元素修改。