欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析pandas apply() 函數(shù)用法(推薦)

 更新時(shí)間:2021年10月31日 14:53:09   作者:stone0823  
這篇文章主要介紹了pandas apply() 函數(shù)用法,大家需要掌握函數(shù)作為一個(gè)對(duì)象,能作為參數(shù)傳遞給其它函數(shù),也能作為函數(shù)的返回值,具體內(nèi)容詳情跟隨小編一起看看吧

理解 pandas 的函數(shù),要對(duì)函數(shù)式編程有一定的概念和理解。函數(shù)式編程,包括函數(shù)式編程思維,當(dāng)然是一個(gè)很復(fù)雜的話題,但對(duì)今天介紹的 apply() 函數(shù),只需要理解:函數(shù)作為一個(gè)對(duì)象,能作為參數(shù)傳遞給其它函數(shù),也能作為函數(shù)的返回值。

函數(shù)作為對(duì)象能帶來(lái)代碼風(fēng)格的巨大改變。舉一個(gè)例子,有一個(gè)類(lèi)型為 list 的變量,包含 從 1 到 10 的數(shù)據(jù),需要從其中找出能被 3 整除的所有數(shù)字。用傳統(tǒng)的方法:

def can_divide_by_three(number):
    if number % 3 == 0:
        return True
    else:
        return False

selected_numbers = []
for number in range(1, 11):
    if can_divide_by_three(number):
        selected_numbers.append(number)

循環(huán)是不可少的,因?yàn)?can_divide_by_three() 函數(shù)只用一次,考慮用 lambda 表達(dá)式簡(jiǎn)化:

divide_by_three = lambda x : True if x % 3 == 0 else False

selected_numbers = []
for number in range(1, 11):
    if divide_by_three(item):
        selected_numbers.append(item)

以上是傳統(tǒng)編程思維方式,而函數(shù)式編程思維則完全不同。我們可以這樣想:從 list 中取出特定規(guī)則的數(shù)字,能不能只關(guān)注和設(shè)置規(guī)則,循環(huán)這種事情交給編程語(yǔ)言去處理呢?當(dāng)然可以。當(dāng)編程人員只關(guān)心規(guī)則(規(guī)則可能是一個(gè)條件,或者由某一個(gè) function 來(lái)定義),代碼將大大簡(jiǎn)化,可讀性也更強(qiáng)。

Python 語(yǔ)言提供 filter() 函數(shù),語(yǔ)法如下:

filter(function, sequence)

filter() 函數(shù)的功能:對(duì) sequence 中的 item 依次執(zhí)行 function(item),將結(jié)果為 True 的 item 組成一個(gè) List/String/Tuple(取決于 sequence 的類(lèi)型)并返回。有了這個(gè)函數(shù),上面的代碼可以簡(jiǎn)化為:

divide_by_three = lambda x : True if x % 3 == 0 else False
selected_numbers = filter(divide_by_three, range(1, 11))

將 lambda 表達(dá)式放在語(yǔ)句中,代碼簡(jiǎn)化到只需要一句話就夠了:

selected_numbers = filter(lambda x: x % 3 == 0, range(1, 11))

Series.apply()

回到主題, pandas 的 apply() 函數(shù)可以作用于 Series 或者整個(gè) DataFrame,功能也是自動(dòng)遍歷整個(gè) Series 或者 DataFrame, 對(duì)每一個(gè)元素運(yùn)行指定的函數(shù)。

舉一個(gè)例子,現(xiàn)在有這樣一組數(shù)據(jù),學(xué)生的考試成績(jī):

  Name Nationality  Score
   張           漢    400
   李           回    450
   王           漢    460

如果民族不是漢族,則總分在考試分?jǐn)?shù)上再加 5 分,現(xiàn)在需要用 pandas 來(lái)做這種計(jì)算,我們?cè)?Dataframe 中增加一列。當(dāng)然如果只是為了得到結(jié)果, numpy.where() 函數(shù)更簡(jiǎn)單,這里主要為了演示 Series.apply() 函數(shù)的用法。

import pandas as pd

df = pd.read_csv("studuent-score.csv")
df['ExtraScore'] = df['Nationality'].apply(lambda x : 5 if x != '漢' else 0)
df['TotalScore'] = df['Score'] + df['ExtraScore']

對(duì)于 Nationality 這一列, pandas 遍歷每一個(gè)值,并且對(duì)這個(gè)值執(zhí)行 lambda 匿名函數(shù),將計(jì)算結(jié)果存儲(chǔ)在一個(gè)新的 Series 中返回。上面代碼在 jupyter notebook 中顯示的結(jié)果如下:

  Name Nationality  Score  ExtraScore  TotalScore
0    張           漢    400           0         400
1    李           回    450           5         455
2    王           漢    460           0         460

apply() 函數(shù)當(dāng)然也可執(zhí)行 python 內(nèi)置的函數(shù),比如我們想得到 Name 這一列字符的個(gè)數(shù),如果用 apply() 的話:

df['NameLength'] = df['Name'].apply(len)

apply 函數(shù)接收帶有參數(shù)的函數(shù)

根據(jù) pandas 幫助文檔 pandas.Series.apply — pandas 1.3.1 documentation,該函數(shù)可以接收位置參數(shù)或者關(guān)鍵字參數(shù),語(yǔ)法如下:

Series.apply(func, convert_dtype=True, args=(), **kwargs)

對(duì)于 func 參數(shù)來(lái)說(shuō),該函數(shù)定義中的第一個(gè)參數(shù)是必須的,所以 funct() 除第一個(gè)參數(shù)之外的其它參數(shù)則被視為額外的參數(shù),作為參數(shù)來(lái)傳遞。我們?nèi)砸詣偛诺氖纠M(jìn)行說(shuō)明,假設(shè)除漢族外,其他少數(shù)名族有加分,我們把加分放在函數(shù)的參數(shù)中,先定義一個(gè) add_extra() 函數(shù):

def add_extra(nationality, extra):
    if nationality != "漢":
        return extra
    else:
        return 0

對(duì) df 新增一列:

df['ExtraScore'] = df.Nationality.apply(add_extra, args=(5,))

位置參數(shù)通過(guò) args = () 來(lái)傳遞參數(shù),類(lèi)型為 tuple。也可用下面的方法調(diào)用:

df['ExtraScore'] = df.Nationality.apply(add_extra, extra=5)

運(yùn)行后結(jié)果為:

  Name Nationality  Score  ExtraScore
0    張           漢    400           0
1    李           回    450           5
2    王           漢    460           0

將 add_extra 作為 lambda 函數(shù):

df['Extra'] = df.Nationality.apply(lambda n, extra : extra if n == '漢' else 0, args=(5,))

下面繼續(xù)講解關(guān)鍵字參數(shù)。假設(shè)我們對(duì)不同的民族可以給不同的加分,定義 add_extra2() 函數(shù):

def add_extra2(nationaltiy, **kwargs):
    return kwargs[nationaltiy]
       
df['Extra'] = df.Nationality.apply(add_extra2, 漢=0, 回=10, 藏=5)

運(yùn)行結(jié)果為:

  Name Nationality  Score  Extra
0    張           漢    400      0
1    李           回    450     10
2    王           漢    460      0

對(duì)照 apply 函數(shù)的語(yǔ)法,不難理解。

DataFrame.apply()

DataFrame.apply() 函數(shù)則會(huì)遍歷每一個(gè)元素,對(duì)元素運(yùn)行指定的 function。比如下面的示例:

import pandas as pd
import numpy as np

matrix = [
    [1,2,3],
    [4,5,6],
    [7,8,9]
]

df = pd.DataFrame(matrix, columns=list('xyz'), index=list('abc'))
df.apply(np.square)

對(duì) df 執(zhí)行 square() 函數(shù)后,所有的元素都執(zhí)行平方運(yùn)算:

    x   y   z
a   1   4   9
b  16  25  36
c  49  64  81

如果只想 apply() 作用于指定的行和列,可以用行或者列的 name 屬性進(jìn)行限定。比如下面的示例將 x 列進(jìn)行平方運(yùn)算:

df.apply(lambda x : np.square(x) if x.name=='x' else x)
    x  y  z
a   1  2  3
b  16  5  6
c  49  8  9

下面的示例對(duì) x 和 y 列進(jìn)行平方運(yùn)算:

df.apply(lambda x : np.square(x) if x.name in ['x', 'y'] else x)
    x   y  z
a   1   4  3
b  16  25  6
c  49  64  9

下面的示例對(duì)第一行 (a 標(biāo)簽所在行)進(jìn)行平方運(yùn)算:

df.apply(lambda x : np.square(x) if x.name == 'a' else x, axis=1)

默認(rèn)情況下 axis=0 表示按列,axis=1 表示按行。

apply() 計(jì)算日期相減示例

平時(shí)我們會(huì)經(jīng)常用到日期的計(jì)算,比如要計(jì)算兩個(gè)日期的間隔,比如下面的一組關(guān)于 wbs 起止日期的數(shù)據(jù):

    wbs   date_from     date_to
  job1  2019-04-01  2019-05-01
  job2  2019-04-07  2019-05-17
  job3  2019-05-16  2019-05-31
  job4  2019-05-20  2019-06-11

假定要計(jì)算起止日期間隔的天數(shù)。比較簡(jiǎn)單的方法就是兩列相減(datetime 類(lèi)型):

import pandas as pd
import datetime as dt

wbs = {
    "wbs": ["job1", "job2", "job3", "job4"],
    "date_from": ["2019-04-01", "2019-04-07", "2019-05-16","2019-05-20"],
    "date_to": ["2019-05-01", "2019-05-17", "2019-05-31", "2019-06-11"]
}

df = pd.DataFrame(wbs)
df['elpased'] = df['date_to'].apply(pd.to_datetime) -   
               df['date_from'].apply(pd.to_datetime)

apply() 函數(shù)將 date_fromdate_to 兩列轉(zhuǎn)換成 datetime 類(lèi)型。我們 print 一下 df:

    wbs   date_from     date_to elapsed
0  job1  2019-04-01  2019-05-01 30 days
1  job2  2019-04-07  2019-05-17 40 days
2  job3  2019-05-16  2019-05-31 15 days
3  job4  2019-05-20  2019-06-11 22 days

日期間隔已經(jīng)計(jì)算出來(lái),但后面帶有一個(gè)單位 days,這是因?yàn)閮蓚€(gè) datetime 類(lèi)型相減,得到的數(shù)據(jù)類(lèi)型是 timedelta64,如果只要數(shù)字,還需要使用 timedeltadays 屬性轉(zhuǎn)換一下。

elapsed= df['date_to'].apply(pd.to_datetime) -
    df['date_from'].apply(pd.to_datetime)
df['elapsed'] = elapsed.apply(lambda x : x.days)

使用 DataFrame.apply() 函數(shù)也能達(dá)到同樣的效果,我們需要先定義一個(gè)函數(shù) get_interval_days() 函數(shù)的第一列是一個(gè) Series 類(lèi)型的變量,執(zhí)行的時(shí)候,依次接收 DataFrame 的每一行。

import pandas as pd
import datetime as dt

def get_interval_days(arrLike, start, end):   
    start_date = dt.datetime.strptime(arrLike[start], '%Y-%m-%d')
    end_date = dt.datetime.strptime(arrLike[end], '%Y-%m-%d') 

    return (end_date - start_date).days


wbs = {
    "wbs": ["job1", "job2", "job3", "job4"],
    "date_from": ["2019-04-01", "2019-04-07", "2019-05-16","2019-05-20"],
    "date_to": ["2019-05-01", "2019-05-17", "2019-05-31", "2019-06-11"]
}

df = pd.DataFrame(wbs)
df['elapsed'] = df.apply(
    get_interval_days, axis=1, args=('date_from', 'date_to'))

參考

Pandas的Apply函數(shù)——Pandas中最好用的函數(shù)
pandas.Series.apply — pandas 1.3.1 documentation

到此這篇關(guān)于pandas apply() 函數(shù)用法的文章就介紹到這了,更多相關(guān)pandas apply() 函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python__name__原理及用法詳解

    python__name__原理及用法詳解

    這篇文章主要介紹了python__name__原理及用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • python實(shí)現(xiàn)猜拳游戲項(xiàng)目

    python實(shí)現(xiàn)猜拳游戲項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)猜拳游戲項(xiàng)目,以excel形式保存信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 一文掌握Python描述符與裝飾器的神奇妙用

    一文掌握Python描述符與裝飾器的神奇妙用

    Python 是一種多范式編程語(yǔ)言,具有靈活的特性,其中可調(diào)用實(shí)例、嵌套函數(shù)、描述符和裝飾器是其功能強(qiáng)大的特性之一,這些概念對(duì)于編寫(xiě)高效、優(yōu)雅的代碼至關(guān)重要
    2024-01-01
  • 一文了解Python3的錯(cuò)誤和異常

    一文了解Python3的錯(cuò)誤和異常

    Python 的語(yǔ)法錯(cuò)誤或者稱(chēng)之為解析錯(cuò),是初學(xué)者經(jīng)常碰到的。即便 Python 程序的語(yǔ)法是正確的,在運(yùn)行它的時(shí)候,也有可能發(fā)生錯(cuò)誤。運(yùn)行期檢測(cè)到的錯(cuò)誤被稱(chēng)為異常。本文就來(lái)和大家聊聊Python3的錯(cuò)誤和異常,感興趣的可以學(xué)習(xí)一下
    2022-09-09
  • 教你使用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易版Web服務(wù)器

    教你使用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易版Web服務(wù)器

    這篇文章主要介紹了教你使用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易版Web服務(wù)器,本篇文章將通過(guò)實(shí)現(xiàn)一個(gè)簡(jiǎn)易版的Web服務(wù)器,幫助讀者理解Python網(wǎng)絡(luò)編程的基本概念和技巧,需要的朋友可以參考下
    2023-04-04
  • Python3.9 beta2版本發(fā)布了,看看這7個(gè)新的PEP都是什么

    Python3.9 beta2版本發(fā)布了,看看這7個(gè)新的PEP都是什么

    這篇文章主要介紹了Python3.9 beta2版本發(fā)布了,看看這7個(gè)新的PEP都是什么,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python3 把一個(gè)列表按指定數(shù)目分成多個(gè)列表的方式

    Python3 把一個(gè)列表按指定數(shù)目分成多個(gè)列表的方式

    今天小編就為大家分享一篇Python3 把一個(gè)列表按指定數(shù)目分成多個(gè)列表的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Django3基于WebSocket實(shí)現(xiàn)WebShell的詳細(xì)過(guò)程

    Django3基于WebSocket實(shí)現(xiàn)WebShell的詳細(xì)過(guò)程

    最近工作中需要開(kāi)發(fā)前端操作遠(yuǎn)程虛擬機(jī)的功能,簡(jiǎn)稱(chēng)WebShell,普通應(yīng)用大部分用的都是wsgi.py配合nginx部署線上服務(wù). 這次主要使用asgi.py,具體實(shí)現(xiàn)過(guò)程跟隨小編一起看看吧
    2021-08-08
  • Pycharm項(xiàng)目代碼同步到Gitee的圖文步驟

    Pycharm項(xiàng)目代碼同步到Gitee的圖文步驟

    本文主要介紹了Pycharm項(xiàng)目代碼同步到Gitee的圖文步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python+django+sql學(xué)生信息管理后臺(tái)開(kāi)發(fā)

    python+django+sql學(xué)生信息管理后臺(tái)開(kāi)發(fā)

    這篇文章主要為大家詳細(xì)介紹了python+django+sql學(xué)生信息管理后臺(tái)開(kāi)發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評(píng)論