Pandas的函数应用及映射方法

CDA数据分析师 出品

在数据分析师日常的数据清洗工作中,经常需要对数据进行各种映射变换,通过Pandas可以非常方便地解决此问题,其提供了map()、apply()、mapapply()等方法,下面将一一详细介绍这三个映射函数的用法及三者的区别。

1. map( )

map方法主要是运用在Series中,用来对Series中的元素进行转化。其语法及参数说明如下:

语法:se.map(arg, na_action=None)

参数说明:

· arg:函数、字典或序列对应的映射

· na_action: 是否忽略NA,默认None

当传入参数arg为序列时,会将传入的序列中与原序列value相匹配的key,所对应的value映射到原序列的value中。

根据指定序列进行一一映射<<< se1 =pd.Series({‘a’:1,‘b’:2,‘c’:3,‘d’:4})<<< se1a 1b 2c 3d 4dtype: int64<<< se2 =pd.Series({1:11,2:22,3:33,4:44})<<< se21 112 223 334 44dtype: int64<<< se1.map(se2)a 11b 22c 33d 44dtype: int64

将以上操作分解为两步来理解:

第一步:将序列se1中的value与序列se2中的key进行匹配。

第二步:将序列se2中key对应的value映射到序列se1中的value

当传入的参数arg为字典时,返回一个根据字典的映射关系对原序列的value进行转换的新序列。

根据指定字典进行一一映射<<< se =pd.Series({‘a’:1,‘b’:2,‘c’:3,‘d’:4})<<< sea 1b 2c 3d 4dtype: int64<<< dic={1:11,2:22,3:33,4:44}<<< dic{1: 11, 2: 22, 3: 33, 4: 44}<<< se.map(dic)a 11b 22c 33d 44dtype: int64

当传入的参数arg为 函数时,会对原序列中每个元素运用该函数,并返回与原序列个数一致,index一致的新序列。运用的函数可以是numpy中的函数,也可以是匿名函数或自定义的函数。

· 直接使用numpy的函数

根据指定函数进行一一映射<<< se=pd.Series({‘a’:-1,‘b’:2,‘c’:-3,‘d’:4})<<< sea -1b 2c -3d 4dtype: int64# 直接使用numpy的函数,不常用 <<< se.map(np.abs)a 1b 2c 3d 4dtype: int64# 直接对Series运用numpy函数效果一致<<< se.abs()a 1b 2c 3d 4dtype: int64

· 使用匿名函数

使用匿名函数<<< se =pd.Series({‘a’:1,‘b’:2,‘c’:3,‘d’:4})<<< sea 1b 2c 3d 4dtype: int64<<< se.map(lambda x:x**2)a 1b 4c 9d 16dtype: int64

· 使用自定义函数

使用匿名函数<<< def fun(x): x=x**2 return x<<< se.map(fun)a 1b 4c 9d 16dtype: int64

2. apply( )

apply()是pandas中使用频率特别高的一种方法,需要重点掌握。apply()方法不仅可以和map()方法一样,得到一个对元素进行转换后相同大小的结果数组,还可以得到一个通过函数进行汇总的标量值。其语法及参数说明如下:

语法:df.apply( **[‘func’, ‘axis=0’, ‘broadcast=None’, ‘raw=False’, ‘reduce=None’, ‘result_type=None’, ‘args=()’, 'kwds’],)

重要参数说明:

· func:对对象操作的函数,可以是numpy中的函数,也可以是匿名函数或自定义的函数

· axis:当输入对象为dataframe时运算依据的轴,0为将函数作用于每列,1为将函数作用于每行,默认None

当输入对象为Series时,apply()会将函数作用于对象中的每个值,效果与map()方法完全一致。

<<< se =pd.Series({‘a’:1,‘b’:2,‘c’:3,‘d’:4})<<< sea 1b 2c 3d 4# 对序列se的每个值进行开平方操作<<< se.apply(np.sqrt)a 1.000000b 1.414214c 1.732051d 2.000000dtype: float64

当输入对象为DataFrame时,apply()方法的作用对象为每一行或者每一列数据,若axis为0,即函数作用于每列数据;若axis为1,即函数作用于每行数据。

<<< df = pd.DataFrame(np.arange(16).reshape(4,4), columns=[‘A’,‘B’,‘C’,‘D’])<<< df A B C D0 0 1 2 31 4 5 6 72 8 9 10 113 12 13 14 15# 对dataframe根据每列求和<<< df.apply(np.sum)A 24B 28C 32D 36dtype: int64 # 对dataframe根据每行求平均值<<< df.apply(np.mean,axis=1)0 1.51 5.52 9.53 13.5dtype: float64

和map()方法一样,apply()中运用的函数可以是上例所示numpy中的函数,也可以是匿名函数或自定义的函数。

使用匿名函数对dataframe进行操作<<< df.apply(lambda x:x2) A B C D0 0 1 4 91 16 25 36 492 64 81 100 1213 144 169 196 225# 使用自定义函数对dataframe进行操作<<< def fun(x): x=x2 return x<<< df.apply(fun) A B C D0 0 1 4 91 16 25 36 492 64 81 100 1213 144 169 196 225

3. applymap( )

上面apply()方法主要是对dataframe数据的行或列进行操作,但如果我们想对datafram数据中的每个元素进行操作,而不进行汇总,该怎么实现呢?

pandas提供的另一个映射函数mapapply(),则能实现将函数运用在元素级别。其语法及参数说明如下:

语法:df.applymap(func)

参数说明:

· func :对元素进行操作的函数

applymap()方法只运用于dataframe数据中,对dataframe数据中的每一元素进行指定函数的操作,其作用类似于map()方法对Series的作用。

对dataframe数据中的每个元素保留2位小数<<< df.applymap(lambda x: ‘%.2f’%x) A B C D0 0.00 1.00 2.00 3.001 4.00 5.00 6.00 7.002 8.00 9.00 10.00 11.003 12.00 13.00 14.00 15.00

4. 总结

map()、apply()、mapapply()三者的区别总结如下:

· **map():**只能作用于Series中的每个元素;

· **apply():**既可以作用于Series中的每个元素,也可以作用于DataFrame中的行或列;

· **applymap():**只能作用于DataFrame中的每个元素。

疫情当下,昔日匆匆的步伐终于放慢了些,也是时候好好想想自己的职业计划和人生规划了。提前做好准备,未雨绸缪,为未来蓄能——蓄势待发!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章