函数应用与映射
在第二节的Series对象中,讲解了部分数学函数的应用,接下来详细讲解Pandas函数的应用与映射。
NumPy中的元素级数组方法也可操作Pandas对象,例如,第二节中的exp()函数。Pandas还可使用DataFrame中的apply()函数实现将函数应用到由各列或各行所形成的一维数组上,具体示例如下所示:
In [1]: import numpy as np
In [2]: from pandas import Series,DataFrame
In [3]: f = DataFrame(np.arange(16).reshape(4,4),index = ['a','b','c','d'],
...: columns = ['one','two','three','four'])
In [4]: func = lambda x : x.max() - x.min()
In [5]: se = f.apply(func)
In [6]: f1 = f.apply(func,axis = 1)
上述代码是使用DataFrame中的apply()函数,其中In [4]是创建lambda()函数,并将其赋值给变量func;In [5]是使用apply()函数对每列元素执行func函数,并将返回结果赋值给变量se;In [6]是使用apply()函数对每行元素执行func函数,并将返回结果赋值给变量f1。各变量的运行结果如下所示:
In [7]: f
Out[7]:
one two three four
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
In [8]: se
Out[8]:
one 12
two 12
three 12
four 12
dtype: int64
In [9]: f1
Out[9]:
a 3
b 3
c 3
d 3
dtype: int64
从上述运行结果可看出,apply()函数可将函数应用到DataFrame对象的各行或各列所形成的一维数组上。
目前,大量常见的数组统计功能都已被实现为DataFrame的内部方法,例如,sum()函数和mean()函数,因此,这些功能无需使用apply()函数。
上述示例中传递给apply()函数的函数返回值为标量值,除此之外,传递给apply()函数的函数还可以返回含多个值的Series对象,具体示例如下所示:
In [10]: import numpy as np
In [11]: from pandas import Series,DataFrame
In [12]: f = DataFrame(np.arange(16).reshape(4,4),index = ['a','b','c','d'],
...: columns = ['one','two','three','four'])
In [13]: def func(x):
...: return Series([x.min(),x.max()],index = ['min','max'])
In [14]: f2 = f.apply(func)
上述代码是使用DataFrame中的apply()函数,其中In [12]是编写func ()函数,并返回由各列的最大值和最小值组成的Series对象;In [14]是使用apply()函数对每列元素执行func()函数,并将返回结果赋值给变量f2。各变量的运行结果如下所示:
In [15]: f
Out[15]:
one two three four
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
In [16]: f2
Out[16]:
one two three four
min 0 1 2 3
max 12 13 14 15
从上述运行结果可看出,传递给apply()函数的函数还可以返回含多个值的Series对象。
DataFrame还可以通过applymap()函数将Python函数应用到元素级数据上,具体示例如下所示:
In [21]: import numpy as np
In [22]: from pandas import Series,DataFrame
In [23]: f = DataFrame(np.arange(16).reshape(4,4),index = ['a','b','c','d'],
...: columns = ['one','two','three','four'])
In [24]: func = lambda x : x + 2
In [25]: f3 = f.applymap(func)
上述代码是使用DataFrame中的applymap()函数,其中In [24]是创建lambda()函数,并将其赋值给变量func,实现将DataFrame对象中每个元素加2的操作;In [25]是使用applymap()函数对每个元素执行func()函数,并将返回结果赋值给变量f3。各变量的运行结果如下所示:
In [26]: f
Out[26]:
one two three four
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
In [27]: f3
Out[27]:
one two three four
a 2 3 4 5
b 6 7 8 9
c 10 11 12 13
d 14 15 16 17
从上述运行结果可看出,applymap()函数可将Python函数应用到元素级数据上,使DataFrame对象中每个元素都添加2。
Series对象中也存在一个元素级应用的函数——map()函数,具体示例如下所示:
In [38]: import numpy as np
In [39]: from pandas import Series,DataFrame
In [40]: f = DataFrame(np.arange(16).reshape(4,4),index = ['a','b','c','d'],
...: columns = ['one','two','three','four'])
In [41]: se = f['one']
In [42]: func = lambda x : x + 2
In [43]: se1 = se.map(func)
上述代码是对Series对象使用map()函数,其中In [41]是Series对象,即f对象列索引为“one”的列,并将其赋值给变量se;In [42]是创建lambda()函数,并将其赋值给变量func,实现将Series对象中每个元素加2的操作;In [43]是使用map()函数对每个元素执行func()函数,并将返回结果赋值给变量se1。各变量的运行结果如下所示:
In [44]: f
Out[44]:
one two three four
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
In [45]: se
Out[45]:
a 0
b 4
c 8
d 12
Name: one, dtype: int32
In [46]: se1
Out[46]:
a 2
b 6
c 10
d 14
Name: one, dtype: int64
从上述运行结果可看出,在Series中,map()函数可将函数应用到元素级数据上,使Series对象中每个元素都添加2。
网友评论