CDA数据分析师 出品
在数据分析师日常的数据清洗工作中,经常需要对数据进行各种映射变换,通过Pandas可以非常方便地解决此问题,其提供了map()、apply()、mapapply()等方法,下面将一一详细介绍这三个映射函数的用法及三者的区别。
map方法主要是运用在Series中,用来对Series中的元素进行转化。其语法及参数说明如下:
语法:se.map(arg, na_action=None)
参数说明:
· arg:函数、字典或序列对应的映射
· na_action: 是否忽略NA,默认None
当传入参数arg为序列时,会将传入的序列中与原序列value相匹配的key,所对应的value映射到原序列的value中。
将以上操作分解为两步来理解:
第一步:将序列se1中的value与序列se2中的key进行匹配。
第二步:将序列se2中key对应的value映射到序列se1中的value
当传入的参数arg为字典时,返回一个根据字典的映射关系对原序列的value进行转换的新序列。
当传入的参数arg为 函数时,会对原序列中每个元素运用该函数,并返回与原序列个数一致,index一致的新序列。运用的函数可以是numpy中的函数,也可以是匿名函数或自定义的函数。
· 直接使用numpy的函数
· 使用匿名函数
· 使用自定义函数
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中的函数,也可以是匿名函数或自定义的函数。
上面apply()方法主要是对dataframe数据的行或列进行操作,但如果我们想对datafram数据中的每个元素进行操作,而不进行汇总,该怎么实现呢?
pandas提供的另一个映射函数mapapply(),则能实现将函数运用在元素级别。其语法及参数说明如下:
语法:df.applymap(func)
参数说明:
· func :对元素进行操作的函数
applymap()方法只运用于dataframe数据中,对dataframe数据中的每一元素进行指定函数的操作,其作用类似于map()方法对Series的作用。
map()、apply()、mapapply()三者的区别总结如下:
· **map():**只能作用于Series中的每个元素;
· **apply():**既可以作用于Series中的每个元素,也可以作用于DataFrame中的行或列;
· **applymap():**只能作用于DataFrame中的每个元素。
疫情当下,昔日匆匆的步伐终于放慢了些,也是时候好好想想自己的职业计划和人生规划了。提前做好准备,未雨绸缪,为未来蓄能——蓄势待发!