
◆ ◆ ◆ ◆ ◆
前言
pandas作為資料處理與分析的利器,它的江湖地位非同小可。在我們資料處理與分析過程中,有時候需要對某一列的每一個值都進行處理,這時候推薦大家使用apply或者map。
但是,二者又有啥差別呢?一起來通過幾個小例子學習一下吧。
APPLY
一、直接使用内置函數或者numpy函數
# 資料展示
>>> df
Out[1]:
姓名 年齡
0 alan 19
1 black 15
2 cici 23
3 david 22
4 eric 18
# 計算字元長度
>>> df['姓名'].apply(len)
Out[2]:
0 4
1 5
2 4
3 5
4 4
Name: 姓名, dtype: int64
# 計算平方
>>> df['年齡'].apply(np.square)
Out[3]:
0 361
1 225
2 529
3 484
4 324
Name: 年齡, dtype: int64
二、使用lambda匿名函數
# 根據年齡打标簽:是否成年
>>> df['年齡'].apply(lambda x: '已成年' if x>=18 else '未成年')
Out[4]:
0 已成年
1 未成年
2 已成年
3 已成年
4 已成年
Name: 年齡, dtype: object
# 修改姓名為首字母大寫
>>> df['姓名'].apply(lambda x: x.title())
Out[5]:
0 Alan
1 Black
2 Cici
3 David
4 Eric
Name: 姓名, dtype: object
三、使用def自定義函數
# 自定義函數
def fn(x):
if x >=18:
return '成年人'
else:
return '未成年'
# 自定義函數作為apply參數
>>> df['年齡'].apply(fn)
Out[6]:
0 成年人
1 未成年
2 成年人
3 成年人
4 成年人
Name: 年齡, dtype: object
需要注意的是,apply不僅可以用于Series,還可用于DataFrame,具體可以根據自己的業務需要,及資料處理規範來使用即可。
MAP
一、直接使用内置函數或者numpy函數
# 計算字元長度
>>> df['姓名'].map(len)
Out[7]:
0 4
1 5
2 4
3 5
4 4
Name: 姓名, dtype: int64
# 計算平方
>>> df['年齡'].map(np.square)
Out[8]:
0 361
1 225
2 529
3 484
4 324
Name: 年齡, dtype: int64
二、使用lambda匿名函數
# 根據年齡打标簽:是否成年
>>> df['年齡'].map(lambda x: '已成年' if x>=18 else '未成年')
Out[9]:
0 已成年
1 未成年
2 已成年
3 已成年
4 已成年
Name: 年齡, dtype: object
# 修改姓名為首字母大寫
>>> df['姓名'].map(lambda x: x.title())
Out[10]:
0 Alan
1 Black
2 Cici
3 David
4 Eric
Name: 姓名, dtype: object
三、使用def自定義函數
# 自定義函數作為map參數
>>> df['年齡'].map(fn)
Out[11]:
0 成年人
1 未成年
2 成年人
3 成年人
4 成年人
Name: 年齡, dtype: object
四、使用dict作為map參數
# apply沒有這種功能!
>>> df['姓名'].map({'alan':'女','black':'男','cici':'女','david':'男','eric':'男'})
Out[12]:
0 女
1 男
2 女
3 男
4 男
Name: 姓名, dtype: object
通過上面的小例子講解,我們可以得出以下結論:
(1)map、apply在用于Series時,對每一個值進行處理,兩者并沒有什麼差別。(是否受資料量影響可以自行驗證)
(2)apply不僅可以用于Series,還可以用于DataFrame;而map隻能用于Series。
(3)一般情況下,apply應用更廣泛,尤其是自定義函數帶多個參數時,建議使用apply。