应用在DataFrame的行或列中,默认为列
apply()可以对DataFrame按行和列(默认)进行函数处理,也支持Series。如果是Series,逐个传入具体值,DataFrame逐行或逐列传入
import pandas as pd
df = pd.DataFrame([['liver','E',89,21,24,64],
['Arry','C',36,37,37,57],
['Ack','A',57,60,18,84],
['Eorge','C',93,96,71,78],
['Oah','D',65,49,61,86]
],
columns = ['name','team','Q1','Q2','Q3','Q4'])
# 将name列中的文本全部转换成小写
res1 = df.name.apply(lambda x:x.lower())
# 去掉一个最高分和一个最低分再算出平均分
def my_mean(s):
max_min_ser = pd.Series([-s.max(), -s.min()])
return s.append(max_min_ser).sum() / (s.count() - 2)
# 对数字列应用函数
res2 = df.select_dtypes(include = 'number').apply(my_mean)
# 同样的算法以学生为维度计算(计算每个学生的平均成绩)
# 在apply函数中传入axis = 1则每行的数据组成一个Series传入自定义函数中
# 设定name为索引
# 横向计算
res3 = df.set_index('name').select_dtypes(include = 'number').apply(my_mean, axis = 1)
结果展示
df
res1
res2
res3
# 总结:apply()可以应用的函数类型如下:
df.apply(fun) # 自定义
df.apply(max) # Python内置函数
df.apply(lambda x:x*2) # lambda
df.apply(np.mean) # NumPy等其他库的函数
df.apply(pd.Series.first_valid_index) # Pandas自己的函数
扩展
1.以下是一个判断一列数据是否包含在另一列数据中的案例
# 判断一个值是否在另一个类似列表的列中
df.apply(lambda d: d.s in d.s_list, axis = 1) # 布尔序列
df.apply(lambda d: d.s in d.s_list, axis = 1).astype(int) # 0和1序列
2.它常被用来与NumPy库中的np.where()方法配合使用,如下例子:
# 函数,将大于90分数标记为good
fun = lambda x: np.where(x.team == 'A' and x.Q1>90,'good','other')
df.apply(fun,axis = 1)
# 效果同上
df.apply(lambda x:x.team == 'A' and x.Q1 > 90, axis = 1).map({True:'good', False:'other'})
df.apply(lambda x:'good' if x.team == 'A' and x.Q1 > 90 else '', axis = 1)