Python中的map()、apply()、applymap()的區(qū)別小結(jié)
1、實(shí)驗(yàn)背景
Pandas庫被廣泛用于數(shù)據(jù)處理和分析。map()、apply()和applymap()方法是Python中常用的轉(zhuǎn)換方法,輸出的結(jié)果及類型完全取決于作為給定方法的參數(shù)的函數(shù)
在日常數(shù)據(jù)處理過程中,會(huì)經(jīng)常遇到這樣的情況,對(duì)一個(gè)DataFrame進(jìn)行逐行/逐列、多行/多列或逐元素的操作,很多同學(xué)可能知道需要用到map()、apply()或者applymap(),但是不知道什么情況下用哪種方法
本文將通過一個(gè)小實(shí)驗(yàn)來探討Python中的map()、apply()和applymap()的區(qū)別和使用場(chǎng)景,并得出結(jié)論
2、實(shí)驗(yàn)過程
數(shù)據(jù)準(zhǔn)備:
import numpy as np import pandas as pd df = pd.DataFrame({'A': [1, 4, 7], 'B': [2, 5, 8], 'C': [3, 6, 9]}) print(df) ''' A B C 0 1 2 3 1 4 5 6 2 7 8 9 '''
map()、apply()和applymap()區(qū)別演示:
1)map()
map(func, *iter):Python內(nèi)置高級(jí)函數(shù),用于對(duì)一個(gè)或多個(gè)可迭代序列的每個(gè)元素執(zhí)行函數(shù)func,例如Series
# 基本使用 df['D'] = list(map(lambda a, b: a + b, df.A, df.B)) print(df) ''' A B C D 0 1 2 3 3 1 4 5 6 9 2 7 8 9 15 ''' df['E'] = list(map(lambda a, b: [a, b], df.A, df.B)) print(df) ''' A B C D E 0 1 2 3 3 [1, 2] 1 4 5 6 9 [4, 5] 2 7 8 9 15 [7, 8] ''' # 應(yīng)用多個(gè)函數(shù)收集:對(duì)A、B兩列應(yīng)用求平均和求和函數(shù),將結(jié)果收集到列表 df['F'] = [list(map(lambda f: f(a, b), [lambda x, y: (x+y)/2, lambda x, y: x+y])) for a, b in zip(df.A, df.B)] print(df) ''' A B C D E F 0 1 2 3 3 [1, 2] [1.5, 3] 1 4 5 6 9 [4, 5] [4.5, 9] 2 7 8 9 15 [7, 8] [7.5, 15] '''
2)apply()
apply(func, axis=0):Pandas DataFrame/Series對(duì)象的方法,對(duì)df某一列/多列或某一行/多行中的元素執(zhí)行函數(shù)func,默認(rèn)axis=0為列
# 對(duì)某一列的每個(gè)元素執(zhí)行函數(shù) df['D'] = df['A'].apply(lambda e: e ** 2) # 對(duì)指定多列的每個(gè)元素執(zhí)行函數(shù) df[['E', 'F']] = df[['A', 'B']].apply(lambda e: -e) # 對(duì)某一行的每個(gè)元素執(zhí)行函數(shù) # 除了pd.concat(),在原df基礎(chǔ)上增量追加一行可使用如下方式(不能使用該方式添加多行) df.loc[3] = df.loc[0].apply(lambda e: e ** 2) # 對(duì)指定多行的每個(gè)元素執(zhí)行函數(shù) df = pd.concat([df, df.loc[0: 1, :].apply(lambda e: -e)], ignore_index=True) print(df) ''' A B C D E F 0 1 2 3 1 -1 -2 1 4 5 6 16 -4 -5 2 7 8 9 49 -7 -8 3 1 4 9 1 1 4 4 -1 -2 -3 -1 1 2 5 -4 -5 -6 -16 4 5 ''' # 對(duì)所有列分別計(jì)算sum # df.index.values[-1]:獲取最后一個(gè)索引值 df.loc[df.index.values[-1]+1] = df.apply(np.sum) print(df) ''' A B C 0 1 2 3 1 4 5 6 2 7 8 9 3 12 15 18 ''' # 對(duì)所有行分別計(jì)算sum df['sum'] = df.apply(np.sum, axis=1) print(df) ''' A B C sum 0 1 2 3 6 1 4 5 6 15 2 7 8 9 24 ''' # 對(duì)DataFrame每個(gè)元素執(zhí)行函數(shù) print(df.apply(lambda e: e + 1)) ''' A B C 0 2 3 4 1 5 6 7 2 8 9 10 '''
3)applymap()
applymap(func)/df.map(func):Pandas DataFrame對(duì)象的方法,Series不支持,用于對(duì)df的每個(gè)元素執(zhí)行函數(shù)func,且將來會(huì)被df.map()替換
在使用Series對(duì)象執(zhí)行時(shí)報(bào)錯(cuò)如下:
AttributeError: 'Series' object has no attribute 'applymap'
在使用DataFrame對(duì)象執(zhí)行時(shí)警告如下:
FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.
print(df.applymap(lambda e: e + 1)) print(df.map(lambda e: e + 1)) ''' A B C 0 2 3 4 1 5 6 7 2 8 9 10 '''
3、實(shí)驗(yàn)結(jié)論
1) map(func, *iter)是Python內(nèi)置高級(jí)函數(shù),可以直接調(diào)用,用于對(duì)一個(gè)或多個(gè)可迭代序列的每個(gè)元素執(zhí)行函數(shù)
2) apply(func, axis=0)是DataFrame/Series對(duì)象的方法,用于對(duì)df某一列(Series)/多列或某一行(Series)/多行中的每個(gè)元素執(zhí)行函數(shù)
3) applymap(func)僅是DataFrame對(duì)象的方法,不支持Series,不能指定軸axis,用于對(duì)df的每個(gè)元素執(zhí)行函數(shù),且將來會(huì)被df.map()替換
4) 在對(duì)DataFrame或Series運(yùn)用apply()、applymap()的時(shí)候,必須保證所有的字段類型與函數(shù)的參數(shù)及結(jié)果一致
到此這篇關(guān)于Python中的map()、apply()、applymap()的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)Python map()、apply()、applymap()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)豎排打印傳單手機(jī)號(hào)碼易撕條
這篇文章主要介紹了Python實(shí)現(xiàn)豎排打印傳單手機(jī)號(hào)碼易撕條,代碼非常簡(jiǎn)單,功能很實(shí)用,推薦給大家,有需要的小伙伴,參考下2015-03-03基于python的itchat庫實(shí)現(xiàn)微信聊天機(jī)器人(推薦)
這篇文章主要介紹了基于python的itchat庫實(shí)現(xiàn)微信聊天機(jī)器人,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10解決django同步數(shù)據(jù)庫的時(shí)候app models表沒有成功創(chuàng)建的問題
今天小編就為大家分享一篇解決django同步數(shù)據(jù)庫的時(shí)候app models表沒有成功創(chuàng)建的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08給Django Admin添加驗(yàn)證碼和多次登錄嘗試限制的實(shí)現(xiàn)
這篇文章主要介紹了給Django Admin添加驗(yàn)證碼和多次登錄嘗試限制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07python GUI庫圖形界面開發(fā)之PyQt5時(shí)間控件QTimer詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5時(shí)間控件QTimer詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02Python實(shí)現(xiàn)圖像和辦公文檔處理的方法和技巧
本文介紹了Python實(shí)現(xiàn)圖像和辦公文檔處理的方法和技巧,包括使用Pillow庫處理圖像、使用OpenCV庫進(jìn)行圖像識(shí)別和處理、使用PyPDF2庫處理PDF文檔、使用docx和xlwt庫處理Word和Excel文檔等,幫助讀者更好地掌握Python在圖像和辦公文檔處理方面的應(yīng)用2023-05-05Python實(shí)現(xiàn)的文本對(duì)比報(bào)告生成工具示例
這篇文章主要介紹了Python實(shí)現(xiàn)的文本對(duì)比報(bào)告生成工具,涉及Python基于difflib模塊實(shí)現(xiàn)對(duì)文本內(nèi)容進(jìn)行對(duì)比的相關(guān)操作技巧,需要的朋友可以參考下2018-05-05