Pandas使用自定义函数
如果想要应用自定义的函数,或者把其他库中的函数应用到 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.850840 0.610775 -0.505202
1 0.917392 2.161789 1.328820
2 -0.156028 0.341495 0.453001
3 -1.559997 0.417146 0.523934c1 c2 c3
0 2.149160 3.610775 2.494798
1 3.917392 5.161789 4.328820
2 2.843972 3.341495 3.453001
3 1.440003 3.417146 3.523934
操作行或列
如果要操作 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.530732
col2 -0.342875
col3 -0.084475
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.096187 0.364572 0.540722
1 1.104303 0.828945 1.934899
2 -0.729590 -0.191682 -0.034498
3 -1.417456 -1.791642 -0.684111
4 -0.308070 -1.792694 1.202829
0 0.269702
1 1.289383
2 -0.318590
3 -1.297736
4 -0.299311
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 2.030803
col2 4.066959
col3 3.299731
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 -52.406407
1 32.888598
2 -9.912873
3 88.483745
4 -35.230463
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 0.734909 4.995270 -9.110182
1 17.239229 -12.155135 -8.417007
2 9.963120 -4.794181 -0.279020
3 9.242199 -1.470281 16.901597
4 -10.010589 7.137905 -0.614954
col1 0.543377
col2 -0.125728
col3 -0.030391
dtype: float64