如果想要应用自定义的函数,或者把其他库中的函数应用到 Pandas 对象中,有以下三种方法:
- 1) 操作整个 DataFrame 的函数:pipe()
- 2) 操作行或者列的函数:apply()
- 3) 操作单一元素的函数:applymap()
如何从上述函数中选择适合的函数,这取决于函数的操作对象。下面介绍了三种方法的使用。
操作整个数据表
通过给 pipe() 函数传递一个自定义函数和适当数量的参数值,从而操作 DataFrme 中的所有元素。下面示例,实现了数据表中的元素值依次加 3。
首先自定义一个函数,计算两个元素的加和,如下所示:
def adder(ele1,ele2): return ele1+ele2
然后使用自定义的函数对 DataFrame 进行操作:
df = pd.DataFrame(np.random.randn(4,3,columns=['c1','c2','c3']) #传入自定义函数以及要相加的数值3 df.pipe(adder,3)
完整的程序,如下所示:
import pandas as pd import numpy as np #自定义函数 def adder(ele1,ele2): return ele1+ele2 #操作DataFrame df = pd.DataFrame(np.random.randn(4,3),columns=['c1','c2','c3']) #相加前 print(df) #相加后 print(df.pipe(adder,3))
输出结果:
c1 c2 c3 0 -0.584164 0.818250 1.590437 1 -0.258288 0.447029 1.938420 2 -0.390319 -0.580696 1.948987 3 -1.862551 -0.568357 0.979224 c1 c2 c3 0 2.415836 3.818250 4.590437 1 2.741712 3.447029 4.938420 2 2.609681 2.419304 4.948987 3 1.137449 2.431643 3.979224
操作行或列
如果要操作 DataFrame 的某一行或者某一列,可以使用 apply() 方法,该方法与描述性统计方法类似,都有可选参数 axis,并且默认按列操作。示例如下:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3']) df.apply(np.mean) #默认按列操作,计算每一列均值 print(df.apply(np.mean))
输出结果:
col1 -0.437947 col2 -0.616736 col3 0.031630 dtype: float64
传递轴参 axis=1, 表示逐行进行操作,示例如下:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3']) print(df) print (df.apply(np.mean,axis=1))
输出结果:
col1 col2 col3 0 -0.978815 -1.963001 -0.478531 1 1.082236 1.103087 0.689981 2 0.321379 -0.600465 -0.169709 3 -1.394568 -0.213248 1.284493 4 0.585636 -0.568272 -0.043831 0 -1.140116 1 0.958435 2 -0.149599 3 -0.107774 4 -0.008822 dtype: float64
求每一列中,最大值与最小值之差。示例如下:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3']) print(df.apply(lambda x: x.max() - x.min()))
输出结果:
col1 1.943701 col2 2.408108 col3 1.576472 dtype: float64
操作单一元素
DataFrame 数据表结构的 applymap() 和 Series 系列结构的 map() 类似,它们都可以接受一个 Python 函数,并返回相应的值。
示例如下:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3']) #自定义函数lambda函数 print(df['col1'].map(lambda x:x*100))
输出结果:
0 -18.171706 1 1.582861 2 22.398156 3 32.395690 4 -133.143543 Name: col1, dtype: float64
下面示例使用了 applymap() 函数,如下所示:
import pandas as pd import numpy as np #自定义函数 df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3']) print(df.applymap(lambda x:x*10)) print(df.apply(np.mean))
输出结果:
col1 col2 col3 0 -1.055926 7.952690 15.225932 1 9.362457 -12.230732 7.663450 2 2.910049 -2.782934 2.073905 3 -12.008132 -1.444989 5.988144 4 2.877850 6.563894 8.192513 #求均值: col1 0.041726 col2 -0.038841 col3 0.782879 dtype: float64