pandas使用函數(shù)批量處理數(shù)據(jù)(map、apply、applymap)
前言
在我們對(duì)DataFrame對(duì)象進(jìn)行處理時(shí)候,下意識(shí)的會(huì)想到對(duì)DataFrame進(jìn)行遍歷,然后將處理后的值再填入DataFrame中,這樣做比較繁瑣,且處理大量數(shù)據(jù)時(shí)耗時(shí)較長(zhǎng)。Pandas內(nèi)置了一個(gè)可以對(duì)DataFrame批量進(jìn)行函數(shù)處理的工具:map、apply和applymap。
提示:為方便快捷地解決問題,本文僅介紹函數(shù)的主要用法,并非全面介紹
一、pandas.Series.map()是什么?
把Series中的值進(jìn)行逐一映射,帶入進(jìn)函數(shù)、字典或Series中得出的另一個(gè)值。
Series.map(arg, na_action=None)
參數(shù):
- arg:函數(shù)、字典類數(shù)據(jù)、Series;映射對(duì)應(yīng)關(guān)系
- na_action{None, ‘ignore'}:默認(rèn)為None;處理NaN變量,如果為None則不處理NaN對(duì)象,如果為‘ignore'則將NaN對(duì)象當(dāng)做普通對(duì)象帶入規(guī)則。
返回Series
二、pandas.Series.map()用法和優(yōu)點(diǎn)
本節(jié)主要講述map()函數(shù)的主要用法和相比于方法的優(yōu)點(diǎn)
1、map()用法
創(chuàng)建案例DataFrame
import pandas as pd
import numpy as np
import time
data = pd.DataFrame({'name':['Verne Raymond','Chapman Becher','Patrick George','Saxon MacArthur',
'Joshua Marjory','Luther Pigou','Fanny Agnes','Karen Bush','Elaine Whitman'],
'gender':[0,1,0,0,1,1,1,0,1],'first_name':np.nan,'last_name':np.nan})
print(data)
name gender first_name last_name
0 Verne Raymond 0 NaN NaN
1 Chapman Becher 1 NaN NaN
2 Patrick George 0 NaN NaN
3 Saxon MacArthur 0 NaN NaN
4 Joshua Marjory 1 NaN NaN
5 Luther Pigou 1 NaN NaN
6 Fanny Agnes 1 NaN NaN
7 Karen Bush 0 NaN NaN
8 Elaine Whitman 1 NaN NaN
現(xiàn)在需要將name列的姓和名拆分開來(lái)分別放入first_name 和last_name里面,使用map()函數(shù)實(shí)現(xiàn),并計(jì)算所用時(shí)間
def first_name_map(x):
return x.split(' ')[0]
def last_name_map(x):
return x.split(' ')[1]
data['first_name'] = data['name'].map(first_name_map)
data['last_name'] = data['name'].map(last_name_map)
print('use time:'+str(end-start))
print(data)
use time:0.0009970664978027344
name gender first_name last_name
0 Verne Raymond 0 Verne Raymond
1 Chapman Becher 1 Chapman Becher
2 Patrick George 0 Patrick George
3 Saxon MacArthur 0 Saxon MacArthur
4 Joshua Marjory 1 Joshua Marjory
5 Luther Pigou 1 Luther Pigou
6 Fanny Agnes 1 Fanny Agnes
7 Karen Bush 0 Karen Bush
8 Elaine Whitman 1 Elaine Whitman
如果要將性別代號(hào)的0、1替換為中文Male和Female,可以使用字典映射功能,如下
data['gender'] = data['gender'].map({0:'Female',1:'Male'})
print(data)
name gender first_name last_name
0 Verne Raymond Female Verne Raymond
1 Chapman Becher Male Chapman Becher
2 Patrick George Female Patrick George
3 Saxon MacArthur Female Saxon MacArthur
4 Joshua Marjory Male Joshua Marjory
5 Luther Pigou Male Luther Pigou
6 Fanny Agnes Male Fanny Agnes
7 Karen Bush Female Karen Bush
8 Elaine Whitman Male Elaine Whitman
2、map()相比其他方式的優(yōu)點(diǎn)
較普通的方法主要是方便和速度快,下面例子進(jìn)行對(duì)比,上面已經(jīng)計(jì)算過使用map()方法處理的速度為:0.0009970664978027344
傳統(tǒng)遍歷
start = time.time()
for index,rows in data.iterrows():
data['first_name'][index] = rows['name'].split(' ')[0]
data['last_name'][index] = rows['name'].split(' ')[1]
end = time.time()
print('use time:'+str(end-start))
use time:0.5146446228027344
可以看到使用map()方法比使用直接遍歷的方式快了500多倍
list暫存的方法
start = time.time()
first_name = []
last_name = []
for index,rows in data.iterrows():
first_name.append(rows['name'].split(' ')[0])
last_name.append(rows['name'].split(' ')[1])
data['first_name'] = first_name
data['last_name'] = last_name
end = time.time()
print('use time:'+str(end-start))
use time:0.001994609832763672
可以看出來(lái)使用list暫存的方法比遍歷方法快了250多倍,但是比map方法還是慢了一半
二、apply()函數(shù)
apply()的使用方法與map()的使用方法類似,只是apply()除了傳入Series參數(shù)外還可以多傳入額外的參數(shù)。
Series.apply(func,convert_dtype = True,args = (), **kwds)
參數(shù):
func:函數(shù)名稱
convert_dtype:bool類值, 默認(rèn)為True;嘗試自己尋找最適合的數(shù)據(jù)類型。如果為False則dtype=object。
args:元組;在Series之后傳遞位置參數(shù)信息
**kwds:給函數(shù)傳遞其他參數(shù)(以字典的形式)
返回Series或DataFrame
下面是案例(參考官方文檔案例)
s = pd.Series([20, 21, 12],index=['London', 'New York', 'Helsinki']) print(s)
London 20
New York 21
Helsinki 12
dtype: int64
處理數(shù)據(jù)
def subtract_custom_value(x, custom_value): return x - custom_value s.apply(subtract_custom_value, args=(5,))
London 15
New York 16
Helsinki 7
dtype: int64
使用**kwds參數(shù)
def subtract_custom_value(x, **kwds):
for key in kwds:
x -= kwds[key]
return x
s.apply(subtract_custom_value, num = 5)
London 15
New York 16
Helsinki 7
dtype: int64
三、applymap()函數(shù)用法
applymap()函數(shù)處理的對(duì)象是DataFrame,并非Series,它沒有前面兩個(gè)函數(shù)用得多,但在某些情況也很有用。
DataFrame.applymap(func)
參數(shù):
func:函數(shù);要調(diào)用的Python函數(shù),輸入輸出都為單個(gè)值
返回DataFrame
下面是簡(jiǎn)單的案例:
import pandas as pd
import numpy as np
data = pd.DataFrame(
{
"A":np.random.randn(3),
"B":np.random.randn(3),
"C":np.random.randn(3),
}
)
print(data )
A B C
0 2.128483 -1.701311 -1.362955
1 -1.149937 1.108856 -0.259637
2 -0.076621 -0.379672 -2.636464
計(jì)算所有值的平方:
data.applymap(lambda x: x**2)
A B C
0 4.530439 2.894459 1.857645
1 1.322356 1.229561 0.067411
2 0.005871 0.144151 6.950940
總結(jié)
本文展示了Pandas將數(shù)據(jù)映射到函數(shù)里批量快速處理的方法,主要使用的了Pandas自帶的map、apply和applymap工具,實(shí)驗(yàn)結(jié)果是比普通循環(huán)快500倍,后續(xù)還將介紹更多數(shù)據(jù)處理實(shí)用的技巧。
到此這篇關(guān)于pandas使用函數(shù)批量處理數(shù)據(jù)(map、apply、applymap)的文章就介紹到這了,更多相關(guān)pandas函數(shù)批量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python opencv旋轉(zhuǎn)圖像(保持圖像不被裁減)
這篇文章主要為大家詳細(xì)介紹了python opencv旋轉(zhuǎn)圖像,保持圖像不被裁減,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Python2.x利用commands模塊執(zhí)行Linux shell命令
這篇文章主要介紹了Python2.x利用commands模塊執(zhí)行Linux shell命令 的相關(guān)資料,需要的朋友可以參考下2016-03-03
Python應(yīng)用實(shí)現(xiàn)處理excel數(shù)據(jù)過程解析
這篇文章主要介紹了Python應(yīng)用實(shí)現(xiàn)處理excel數(shù)據(jù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
探索Python元類與class語(yǔ)句協(xié)議掌握類的控制權(quán)
這篇文章主要介紹了通過Python元類與class語(yǔ)句協(xié)議掌握類的控制權(quán)探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Flask URL傳參與視圖映射的實(shí)現(xiàn)方法
這篇文章主要介紹了Flask URL傳參與視圖映射的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-03-03
Python 20行簡(jiǎn)單實(shí)現(xiàn)有道在線翻譯的詳解
這篇文章主要介紹了Python實(shí)現(xiàn)有道在線翻譯的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
python中使用PIL制作并驗(yàn)證圖片驗(yàn)證碼
本篇文章給大家分享了python中使用PIL制作并驗(yàn)證圖片驗(yàn)證碼的具體代碼以及說(shuō)明,需要的朋友參考下吧。2018-03-03
Jupyter?notebook無(wú)法鏈接內(nèi)核、運(yùn)行代碼問題
文章主要介紹了在VSCode中使用Jupyter?Notebook遇到的問題及其解決過程,問題包括包版本沖突、文件沖突、路徑錯(cuò)誤和找不到文件,通過逐一排查和安裝相關(guān)依賴包,最終解決了這些問題,使得Jupyter?Notebook可以在VSCode中正常運(yùn)行2025-02-02

