apply函数对于Series,可以对每个元素执行操作,但是对DataFrame的话,则是对每列执行函数,如果想要每个元素操作的话,应该使用applymap。
Series.apply()
回到主题, pandas 的 apply() 函数可以作用于 Series 或者整个 DataFrame,功能也是自动遍历整个 Series 或者 DataFrame, 对每一个元素运行指定的函数。
举一个例子,现在有这样一组数据,学生的考试成绩:
Name Nationality Score
1 张 汉 400
2 李 回 450
3 王 汉 460
如果民族不是汉族,则总分在考试分数上再加 5 分,现在需要用 pandas 来做这种计算,我们在 Dataframe 中增加一列。当然如果只是为了得到结果, numpy.where() 函数更简单,这里主要为了演示 Series.apply() 函数的用法。
import pandas as pd
df = pd.read_csv("studuent-score.csv")
df['ExtraScore'] = df['Nationality'].apply(lambda x : 5 if x != '汉' else 0)
df['TotalScore'] = df['Score'] + df['ExtraScore']
对于 Nationality 这一列, pandas 遍历每一个值,并且对这个值执行 lambda 匿名函数,将计算结果存储在一个新的 Series 中返回。上面代码在 jupyter notebook 中显示的结果如下:
Name Nationality Score ExtraScore TotalScore
0 张 汉 400 0 400
1 李 回 450 5 455
2 王 汉 460 0 460
apply() 函数当然也可执行 python 内置的函数,比如我们想得到 Name 这一列字符的个数,如果用 apply() 的话:
df['NameLength'] = df['Name'].apply(len)
DataFrame.apply()
DataFrame.apply() 函数则会遍历每一个元素,对元素运行指定的 function。比如下面的示例:
import pandas as pd
import numpy as np
matrix = [
[1,2,3],
[4,5,6],
[7,8,9]
]
df = pd.DataFrame(matrix, columns=list('xyz'), index=list('abc'))
df.apply(np.square)
对 df 执行 square() 函数后,所有的元素都执行平方运算:
x y z
a 1 4 9
b 16 25 36
c 49 64 81
如果只想 apply() 作用于指定的行和列,可以用行或者列的 name 属性进行限定。比如下面的示例将 x 列进行平方运算:
df.apply(lambda x : np.square(x) if x.name=='x' else x)
x y z
a 1 2 3
b 16 5 6
c 49 8 9
下面的示例对 x 和 y 列进行平方运算:
df.apply(lambda x : np.square(x) if x.name in ['x', 'y'] else x)
x y z
a 1 4 3
b 16 25 6
c 49 64 9
下面的示例对第一行 (a 标签所在行)进行平方运算:
df.apply(lambda x : np.square(x) if x.name == 'a' else x, axis=1)
默认情况下 axis=0 表示按列,axis=1 表示按行。