国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一文了解 Pandas 的 apply 函數妙用

開發
在眾多方法中,apply() 函數以其靈活性脫穎而出,是處理復雜數據轉換和應用自定義邏輯的強大工具。本文將介紹apply() 函數的用途、原理以及如何在實際工作中發揮它的“妙用”。

在數據處理和分析領域,Pandas DataFame 是我們最常用的數據結構之一。它提供了豐富的功能來清洗、轉換和分析數據。在眾多方法中,apply() 函數以其靈活性脫穎而出,是處理復雜數據轉換和應用自定義邏輯的強大工具。本文將介紹apply() 函數的用途、原理以及如何在實際工作中發揮它的“妙用”。

一、apply 函數介紹

apply() 是 Pandas Series 和 DataFrame 對象的一個方法,用于沿軸(axis)應用函數。簡單來說,就是把一個函數批量地作用于 DataFrame 的行、列或 Series 的元素。

DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwds)
Series.apply(func, convert_dtype=True, args=(), **kwds)

其中最重要的參數是 axis:

  • axis=0 (默認): 將函數應用到 每一列。此時,函數接收一個 Series 對象(即 DataFrame 的每一列)。
  • axis=1: 將函數應用到 每一行。此時,函數接收一個 Series 對象(即 DataFrame 的每一行)。

對于 Series 的 apply 方法,axis 參數不存在,函數直接作用于 Series 的每個元素(或 Series 本身,取決于函數定義)。

二、apply() 的應用場景與優勢

Pandas 提供了大量高度優化的內置函數(如 sum(), mean(), fillna(), str.contains() 等)和向量化操作(如直接的四則運算 df['A'] + df['B'])。這些方法通常效率最高,應優先使用。

那么,什么時候需要 apply() 呢?apply() 的妙用體現在以下場景:

  • 函數無法直接向量化: 當你需要應用的邏輯比較復雜,無法用簡單的數學運算、布爾索引或 Pandas 內置方法直接表示時,可以將其封裝在一個 Python 函數中,然后使用 apply() 應用。
  • 處理行級別或列級別的復雜邏輯: 尤其是 axis=1 時,你的函數可以訪問到一整行的所有列的數據,從而基于行內多個值進行判斷、計算或生成結果。這在需要上下文信息的處理中非常有用。
  • 返回值多樣化: apply() 可以返回一個 Series (對應原始 Series 或 DataFrame 的新一列/一行),也可以在特定配置下返回多個值(展開為新的多列)。

相比于直接使用 Python 循環遍歷 DataFrame 的行(如 for index, row in df.iterrows():),apply() 在內部通常會做一些優化,雖然可能不如純粹的向量化操作快,但通常比顯式 Python 循環要高效且代碼更簡潔、更具“Pandas風格”。

三、apply() 函數的妙用示例

為了更好地理解 apply() 的強大之處,我們來看幾個實際案例。

首先,創建一個示例 DataFrame:

import pandas as pd
import numpy as np

data = {
    'StudentID': [1, 2, 3, 4, 5, 6, 7, 8],
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva', 'Frank', 'Grace', 'Henry'],
    'Gender': ['F', 'M', 'M', 'M', 'F', 'M', 'F', 'M'],
    'MathScore': [85, 90, 78, np.nan, 92, 70, 88, 95],
    'EnglishScore': [90, 88, 85, 92, np.nan, 75, 91, 89],
    'Class': ['A', 'B', 'A', 'C', 'B', 'C', 'A', 'B']
}
df = pd.DataFrame(data)
print("--- 原始 DataFrame ---")
print(df)
print("\n")

案例 1: 對列應用統計函數 (axis=0)

# 定義一個計算極差的函數
def range_score(col):
    # 需要處理缺失值,這里選擇忽略NaN
    return col.max() - col.min()

# 對數值列應用 range_score 函數 (axis=0 是默認值,可省略)
# 僅選擇數值列進行計算
numeric_cols = df.select_dtypes(include=np.number).columns
score_ranges = df[numeric_cols].apply(range_score, axis=0)

print("--- 各數值列的分數極差 ---")
print(score_ranges)
print("\n")

當 axis=0 時,apply() 會將 DataFrame 的每一列(作為一個 Series)依次傳遞給 range_score 函數。函數計算后返回一個值,這些值最終組合成一個新的 Series,索引是原始 DataFrame 的列名。

案例 2: 對行應用判斷邏輯 (axis=1)

根據一個學生的數學和英語成績總分來判斷其等級。這個邏輯需要同時考慮一行中的兩個列的值。

# 定義一個根據總分判斷等級的函數
def judge_grade(row):
    # 訪問行中的列數據
    total_score = row['MathScore'] + row['EnglishScore']

    # 處理總分因缺失值而為 NaN 的情況
    if pd.isna(total_score):
        return'待定'# Or 'N/A', '未知'
    elif total_score >= 180:
        return'優秀'
    elif total_score >= 150:
        return'良好'
    else:
        return'及格'

# 對 DataFrame 的每一行應用 judge_grade 函數
# axis=1 表示按行應用,函數的輸入是每一行的數據 (一個 Series)
df['OverallGrade'] = df.apply(judge_grade, axis=1)

print("--- 添加等級列后的 DataFrame (部分) ---")
print(df[['StudentID', 'MathScore', 'EnglishScore', 'OverallGrade']])
print("\n")

axis=1 是此例的關鍵。它讓 apply() 將 DataFrame 的每一行作為參數(一個 Series,其中索引是原始列名)傳遞給 judge_grade 函數。在函數內部,我們可以方便地通過 row['列名'] 的方式獲取該行對應列的值,進行復雜的邏輯判斷。函數的返回值(一個字符串)會組成新的 Series,被賦值給新列 'OverallGrade'。

案例 3: 行級別復雜計算并返回多個結果 (axis=1, result_type='expand')

有時,一個行級別的計算或處理可能需要返回多個值,例如從一個包含全名的列中提取姓和名,或者計算某行數據的多個統計指標。

# 定義一個函數,從 Name 列中提取姓和名
def split_name_parts(row):
    full_name = row['Name']
    parts = full_name.split(' ', 1) # 最多分割一次
    first_name = parts[0]
    last_name = parts[1] if len(parts) > 1else''# 如果沒有空格,則姓為空

    # 返回一個 Series 或 List
    return pd.Series([first_name, last_name])

# 對 DataFrame 的每一行應用 split_name_parts 函數
# axis=1 按行應用
# result_type='expand' 將函數返回的 Series/List 展開成多列
name_parts = df.apply(split_name_parts, axis=1, result_type='expand')

# 將新生成的列添加到原 DataFrame 中
df[['FirstName', 'LastName']] = name_parts
# 也可以直接這樣寫:
# df[['FirstName', 'LastName']] = df.apply(split_name_parts, axis=1, result_type='expand')


print("--- 添加姓和名列后的 DataFrame (部分) ---")
df[['Name', 'FirstName', 'LastName']]

函數 split_name_parts 處理每一行的 'Name' 列,并返回一個包含兩個元素的 Series。通過設置 result_type='expand',Pandas 會將這個 Series 的每個元素作為新列添加到結果中。這種方法非常適合批量解析、分解或從復雜數據中提取多個字段。

案例 4: 結合 Lambda 表達式的簡潔用法

對于簡單的、單行的函數邏輯,可以使用 Lambda 表達式與 apply() 結合,使代碼更簡潔。

# 場景:根據 MathScore 是否大于等于 90 創建一個布爾列 'MathExcellent'
# 使用 apply 結合 lambda 和 axis=1
df['MathExcellent_apply'] = df.apply(lambda row: row['MathScore'] >= 90 if pd.notna(row['MathScore']) else False, axis=1)

# (對比向量化寫法,通常更簡潔高效)
# df['MathExcellent_vec'] = df['MathScore'] >= 90 # 會將 NaN 結果為 False/True, 需額外處理 NaN

print("--- 使用 Lambda 和 apply 添加布爾列 (部分) ---")
print(df[['StudentID', 'MathScore', 'MathExcellent_apply']]) # , 'MathExcellent_vec'
print("\n")

Lambda 表達式提供了一種創建小型匿名函數的快捷方式。在 apply() 中,尤其是在 axis=1 需要快速訪問單行數據時,Lambda 表達式非常方便。雖然此處向量化寫法更優,但對于涉及更復雜條件或多列組合判斷的布爾邏輯,apply(lambda row: ..., axis=1) 結合 if/else 是常見的模式。

四、使用 apply() 的注意事項

盡管 apply() 非常靈活,但需要注意其潛在的性能問題:

  • 優先使用向量化操作: Pandas 的許多操作都是經過高度優化的 C 實現。如果你的任務可以通過向量化運算、Pandas 內置方法或 Numpy 函數直接完成,應優先考慮它們,它們通常比 apply() 快得多。
  • apply() 與循環: 在許多情況下,apply() 比顯式的 Python for 循環遍歷行要快,因為它在底層可能進行了部分向量化或更好的內存管理。但在某些極端場景或非常簡單的操作中,性能差異可能不明顯。
  • apply(axis=1) 的開銷: 對行應用函數 (axis=1) 通常比對列應用 (axis=0) 開銷更大,因為它需要為每一行創建一個 Series 對象并調用 Python 函數。
  • 避免在 apply 中進行昂貴的重復計算: 如果函數內部有可以在外部一次性計算并傳入的參數,盡量這樣做。

總的來說,apply() 是一個強大的工具,尤其適用于處理那些無法簡單向量化,需要訪問行或列的全部上下文的復雜邏輯。在處理大型數據集對性能要求極高時,可以考慮 Numba 或 Cython 等更底層的優化工具,但對于大多數日常任務,apply() 提供的便利性是無可替代的。

責任編輯:趙寧寧 來源: Python數智工坊
相關推薦

2020-08-27 07:34:50

Zookeeper數據結構

2019-08-06 09:00:00

JavaScript函數式編程前端

2024-02-01 11:57:31

this指針代碼C++

2023-11-20 08:18:49

Netty服務器

2023-04-26 15:43:24

容器編排容器編排工具

2022-02-25 07:34:36

MQTT協議RabbitMQ

2025-05-23 09:38:54

JWT開發Go

2023-11-06 08:16:19

APM系統運維

2022-06-08 08:11:56

威脅建模網絡安全網絡攻擊

2022-11-11 19:09:13

架構

2021-09-27 07:39:52

Go初始化函數package

2020-04-21 10:37:41

Apply數據參數

2023-12-26 07:33:45

Redis持久化COW

2022-10-28 13:48:24

Notebook數據開發機器學習

2025-11-13 09:57:41

2023-08-26 20:56:02

滑動窗口協議

2022-02-24 07:34:10

SSL協議加密

2023-10-27 08:15:45

2023-11-08 08:15:48

服務監控Zipkin

2024-01-19 11:53:29

文件系統操作系統存儲
點贊
收藏

51CTO技術棧公眾號

欧美激情女人20p| 欧美xxxx性| 熟女熟妇伦久久影院毛片一区二区| 色婷婷av一区二区| 在线亚洲国产精品网站| 香蕉久久夜色精品国产使用方法| 国产日产一区二区| 真实国产乱子伦对白视频| 蜜桃导航-精品导航| 7777精品视频| 精品国产青草久久久久福利| www.日韩精品| 国模吧视频一区| 先锋成人av| 成人在线黄色电影| 国产精品视频yy9299一区| 国产精品视频一区二区三区综合 | 亚洲一区3d动漫同人无遮挡| 欧美性欧美巨大黑白大战| 亚洲精品婷婷| xxx在线免费观看| 人人妻人人澡人人爽欧美一区双| 在线观看日韩av| 亚洲国产精品高清久久久| 日韩电影免费| 国产伦精品一区二区三区四区视频 | 麻豆影视国产在线观看| 在线不卡日本| 欧美成人精品xxx| 亚洲一区视频在线| 亚洲精品偷拍| 欧美日韩尤物久久| 日韩三级电影免费观看| 免费无码av片在线观看| www.99av.com| 免费三级欧美电影| 日韩免费va| 希岛爱理一区二区三区av高清| 欧美成人二区| 一区二区三区区四区播放视频在线观看 | 亚洲免费在线观看视频| 精品久久久一区二区| 久久99精品久久久| 午夜视频一区| 国产一区二区三区四区老人| 欧美成人午夜77777| 在线观看日韩羞羞视频| 中文字幕在线视频日韩| 欧美xxxxxxxx| 色青青草原桃花久久综合| 亚洲综合免费观看高清完整版 | 水蜜桃亚洲精品| 日本新janpanese乱熟| 你懂的在线视频| 日韩毛片在线一区二区毛片| 在线中文字幕资源| h视频在线免费观看| 猫咪成人在线观看| 一本久久综合| 亚洲综合社区| 国产精品中文字幕日韩精品| 国产欧美日韩在线看| 精品美女国产在线| 精品久久人人做人人爱| 欧美激情视频给我| 国产精品91一区| 国产欧美精品久久久| 亚洲成人黄色在线| 精品美女在线播放| 日韩精品专区在线影院重磅| 色哟哟国产精品| 欧美欧美欧美欧美| 日韩精品视频免费专区在线播放| 亚洲精品网站在线播放gif| 日韩国产欧美精品一区二区三区| 亚洲一区在线视频| 国产精品美女久久久久aⅴ国产馆| 91麻豆精品在线观看| 中文字幕一区二区三区在线观看 | 国产激情视频一区二区在线观看| 《视频一区视频二区| 欧美电影在线免费观看| 欧美精品一区二区在线观看| 亚洲精品少妇网址| 国产精品第一区| 狠狠色综合欧美激情| a级片一区二区| 又黄又免费的网站| 国产小黄视频| 大乳在线免费观看| 三级成人黄色影院| 国产一区清纯| 日韩一级精品视频在线观看| 欧美疯狂性受xxxxx喷水图片| 91免费视频国产| 男人天堂网视频| 亚洲人和日本人hd| 污片在线观看一区二区| 日韩一区国产在线观看| 国产精品久久久久久吹潮| 国产日韩欧美不卡| 日韩一区二区免费看| 久久草在线视频| 免费人成在线不卡| 亚洲色图都市小说| 欧美日韩激情视频在线观看| 欧美另类在线观看| 永久免费网站视频在线观看| 国产精品久久久久久久久久辛辛| 久久久影视传媒| 国产精选久久久久久| 国产黄色在线免费观看| 99久久精品免费看国产| 国产成人精品视频在线| av中文字幕一区二区三区| 国产精品一区二区在线播放 | 欧美丰满老妇厨房牲生活| 色av一区二区三区| 国产女优一区| 欧美亚洲动漫精品| 国产另类自拍| 欧美香蕉爽爽人人爽| 精品一区二区三区在线| 欧美激情一区不卡| 久久影视免费观看| 国产麻豆一区二区三区在线观看| 成人手机在线电影| 91超碰碰碰碰久久久久久综合| 美女黄网久久| 欧美精品aⅴ在线视频| 国产高清视频一区三区| 成人观看网站a| 婷婷综合五月| 97视频在线观看免费高清完整版在线观看 | 午夜精品蜜臀一区二区三区免费 | 欧美一区深夜视频| 亚洲一区影音先锋| 亚洲精品自在久久| 亚洲高潮无码久久| 日本在线观看视频| 亚洲春色h网| 中文av字幕一区| 午夜精品久久久久久久白皮肤| 国产欧美精品aaaaaa片| 99中文字幕在线观看| 最爽无遮挡行房视频在线| 亚洲女同中文字幕| 亚洲综合色成人| 51国偷自产一区二区三区| 神马久久精品| 男人的天堂亚洲在线| 最近2019年好看中文字幕视频| 亚洲欧洲精品在线| 国产一区日韩| 欧美日韩在线免费| 欧美一区深夜视频| 992tv在线影院| 午夜在线精品偷拍| 一本到三区不卡视频| 美女黄毛**国产精品啪啪| fc2在线中文字幕| 欧美专区在线| 4438亚洲最大| 日本精品视频一区| 国产高清一区在线观看| 午夜视频一区| 在线一区二区三区四区| 亚洲巨乳在线观看| 欧美性生活一级| 一区二区三区.www| 久久久精品国产一区二区三区| 电影一区二区在线观看| 亚洲免费观看高清完整版在线观看| 欧美成人网在线| 亚州福利视频| 91蜜桃婷婷狠狠久久综合9色| 久久精品视频在线观看| 激情网站五月天| 欧美顶级大胆免费视频| 欧美电视剧在线看免费| www日韩在线观看| 欧美日本中文| 久热在线中文字幕色999舞| av电影在线观看网址| a级高清视频欧美日韩| 不卡的av在线播放| 成人精品一区二区三区电影黑人| a天堂资源在线| 91精品婷婷国产综合久久竹菊| 曰韩不卡视频| 久久久久国产一区二区三区四区 | 国产又大又长又粗又黄| 成人h动漫精品一区二区| 美女视频免费观看网站在线| 在线观看欧美视频| 你懂的亚洲视频| 日本一区二区久久精品| 最新国产拍偷乱拍精品 | 国产成人精品免费在线| 永久免费看av|