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中的每個元素。

疫情當下,昔日匆匆的步伐終於放慢了些,也是時候好好想想自己的職業計劃和人生規劃了。提前做好準備,未雨綢繆,爲未來蓄能——蓄勢待發!

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