久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

 禁忌石 2022-04-13

發(fā)布時間: 2021-10-31 15:36:43 來源: 互聯(lián)網(wǎng) 作者: stone0823 欄目: python 點擊: 16

目錄Series.apply()apply函數(shù)接收帶有參數(shù)的函數(shù)DataFrame.apply()apply()計算日期相減示例參考理解pandas的函數(shù),,要對函數(shù)式編程有一定的概念和理解,。函...

目錄
  • Series.apply()

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

  • DataFrame.apply()

  • apply() 計算日期相減示例

  • 參考

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

函數(shù)作為對象能帶來代碼風(fēng)格的巨大改變。舉一個例子,,有一個類型為 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)是不可少的,,因為 can_divide_by_three() 函數(shù)只用一次,,考慮用 lambda 表達(dá)式簡化:

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)這種事情交給編程語言去處理呢,?當(dāng)然可以,。當(dāng)編程人員只關(guān)心規(guī)則(規(guī)則可能是一個條件,或者由某一個 function 來定義),,代碼將大大簡化,,可讀性也更強。

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

filter(function, sequence)

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

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

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

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

Series.apply()

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

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

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

如果民族不是漢族,,則總分在考試分?jǐn)?shù)上再加 5 分,現(xiàn)在需要用 pandas 來做這種計算,,我們在 Dataframe 中增加一列,。當(dāng)然如果只是為了得到結(jié)果, numpy.where() 函數(shù)更簡單,,這里主要為了演示 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']

對于 Nationality 這一列, pandas 遍歷每一個值,,并且對這個值執(zhí)行 lambda 匿名函數(shù),,將計算結(jié)果存儲在一個新的 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 這一列字符的個數(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ù),,語法如下:

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

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

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

對 df 新增一列:

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

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

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

運行后結(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è)我們對不同的民族可以給不同的加分,,定義 add_extra2() 函數(shù):

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

運行結(jié)果為:

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

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

DataFrame.apply()

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

import pandas as pdimport 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)

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

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

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

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

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

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

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

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

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

apply() 計算日期相減示例

平時我們會經(jīng)常用到日期的計算,,比如要計算兩個日期的間隔,比如下面的一組關(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

假定要計算起止日期間隔的天數(shù),。比較簡單的方法就是兩列相減(datetime 類型):

import pandas as pdimport 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_from 和 date_to 兩列轉(zhuǎn)換成 datetime 類型,。我們 print 一下 df:

     wbs date_from date_to elapsed0 job1 2019-04-01 2019-05-01 30 days1 job2 2019-04-07 2019-05-17 40 days2 job3 2019-05-16 2019-05-31 15 days3 job4 2019-05-20 2019-06-11 22 days

日期間隔已經(jīng)計算出來,但后面帶有一個單位 days,,這是因為兩個 datetime 類型相減,,得到的數(shù)據(jù)類型是 timedelta64,如果只要數(shù)字,,還需要使用 timedelta 的 days 屬性轉(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á)到同樣的效果,我們需要先定義一個函數(shù) get_interval_days() 函數(shù)的第一列是一個 Series 類型的變量,,執(zhí)行的時候,,依次接收 DataFrame 的每一行。

import pandas as pdimport 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)容請搜索我們以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持我們,!

本文標(biāo)題: 解析pandas apply() 函數(shù)用法(推薦)

本文地址: http://www./jiaoben/python/433983.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多