更新於 2024/12/17閱讀時間約 10 分鐘

[Python筆記] 新手必學:使用 Lambda Function 解決資料篩選和轉換問題

What's up guys! How are you doing? 我是 Rex,今天繼續跟大家分享我的 Python 筆記。

Introduction

今天的主題跟前幾篇不太一樣,我想跟各位介紹一個很好用的函式 - Lambda Function。記得大學在做資料分析的時候常常看到其他人的作品有用到這個技巧,但那時總覺得霧煞煞,覺得這個方法不必要,而且不好懂。我是到了實習公司之後才領悟這個方法的實用以及好處,接下來我就簡單地跟各位介紹這個技巧的使用方法。 Lambda Function 也稱為匿名函式,它與我們熟悉的函式差別就在 lambda 函式是 one-line 而且通常用在當你只需要使用到這個函式一次時,就可以使用這個方法,不僅可以避免建立一個 def block,也可以幫助你寫一個精準的 code。

優點:

  1. 簡單快捷:Lambda 函式是一行代碼,適合用在只需要簡單的操作時。
  2. 不需要命名:不需要為它創建一個新函式名,當你只需要簡單的計算或一個小範圍的操作時,這種方法非常實用。
  3. 即時使用:適合用在一個「立即」的情境,例如排序、過濾等簡單的運算操作。

Coding Question

因為今天的範例使用的資料都不相同,因此我不多描述資料,但我在這邊提供一個我覺得蠻好懂也實用的小抄,幫助大家理解和記憶!

要不要使用變數命名完全取決於使用的時機以及情境,從我提供的例子可以看到,我並沒有使用變數接 Lambda 函式,但在有些情況下的確可以這樣使用。我認為最常用的情境是搭配 filter 或是 map 這樣的函式,你可以在這些函式中設計你自己的條件,細節可以在我下面的範例中看到。

  1. 資料篩選 (Data Filtering) - 很常跟 filter () 一起使用!例子1(篩選數字)/ 例子2(篩選點擊某個產品超過5次的顧客)/ 例子3(篩選出年紀大於30且在 Engineering 部門工作的員工) 。
# Case1 - 篩選數字
# 先建立一個由1~10組成的列表​
numbers = [i for i in range(1, 11)]

# Lambda 函式定義篩選的標準(偶數)​
# 解釋: filter 函式採用我自訂的 lambda 函式,numbers 這個變數是我要篩選的原始資料。列表內的元素會逐一的被丟到 lambda 函式中做條件判斷
even_numbers = filter(lambda x: x % 2 == 0, numbers)

# Outputs: [2, 4, 6, 8, 10]

# Case2 - 篩選出點擊某個產品超過 5 次的顧客
customer_clicks = {
"client1": 3,
"client2": 6,
"client3": 2,
"client4": 7,
"client5": 4,
"client6": 10
}

# 解釋: 將 clicks 丟到 lambda 函式中,當點擊超過5次,該筆資料就被儲存到字典中
frequent_customers = {client: clicks for client, clicks in customer_clicks.items() if (lambda x: x> 5)(clicks)}
frequent_customers # Outputs: {'client2': 6, 'client4': 7, 'client6': 10}

# Case 3 - 篩選出年紀大於30且在 Engineering 部門工作的員工
employees = [
{'name': 'Alice', 'age': 28, 'department': 'Marketing'},
{'name': 'Bob', 'age': 35, 'department': 'Engineering'},
{'name': 'Charlie', 'age': 42, 'department': 'Engineering'},
{'name': 'David', 'age': 25, 'department': 'HR'},
{'name': 'Eve', 'age': 38, 'department': 'Engineering'}
]

# filter() 將此條件應用於員工列表,從而產生一個新列表
filtered_employees = list(filter(lambda e: e['age'] > 30 and e['department'] == 'Engineering', employees))

"""
Outputs:
[{'name': 'Bob', 'age': 35, 'department': 'Engineering'},
{'name': 'Charlie', 'age': 42, 'department': 'Engineering'},
{'name': 'Eve', 'age': 38, 'department': 'Engineering'}]
"""
  1. 資料轉換 (Data Transformation) - 很常跟 map () 一起使用!例子1(調整溫度)/ 例子2(調整產品價錢)。
# Case1 - 調整溫度

celsius_temperatures = [0, 20, 30, 100]

# 解釋: 列表中的溫度被丟到 lambda function 中做轉換,儲存到一個新的列表中
fahrenheit_temperatures = list(map(lambda c: c * 9/5 + 32, celsius_temperatures))
# Outputs: [32.0, 68.0, 86.0, 212.0]

# Case2 - 調整產品價錢

products = [
{'name': 'Product A', 'price': 45},
{'name': 'Product B', 'price': 55},
{'name': 'Product C', 'price': 30},
{'name': 'Product D', 'price': 75}
]

# map() 將此 lambda 函數應用於清單中的每個產品,根據條件轉換原始資料
# 解釋: 字典被丟到 lambda function 中,函式會一筆一筆的處理傳入的資料
adjusted_prices = list(map(lambda p: {'name': p['name'], 'price': p['price'] * 1.10 if p['price'] < 50 else p['price']}, products))

"""
Outputs:
[{'name': 'Product A', 'price': 49.50000000000001},
{'name': 'Product B', 'price': 55},
{'name': 'Product C', 'price': 33.0},
{'name': 'Product D', 'price': 75}]
"""


今天的教程雖然偏短,但每一部分都非常重要!希望今天的教學能幫助讀者更深入了解這個實用的功能。過去我的範例都偏簡單且「假」,但接下來我計畫在出完 NumPy 和 Pandas 的筆記後,展示更實務的資料分析操作。若有機會,也會跟大家分享實際的專案經驗。今天的文章中,我們依然會提供練習題,希望通過這些練習,幫助大家更好地理解和應用 Lambda Function。

Coding Question

  1. 使用 filter 搭配 Lambda Function 篩選出一個數字清單中所有大於 10 的元素。
  2. 使用 map 搭配 Lambda Function 將一個字串列表中的每個字串轉為大寫。

Concpet Quetion

  1. Lambda Function 的主要優點是什麼?試舉一個例子說明如何將 Lambda Function 用於資料篩選或資料轉換。


Conclusion

今天的教學就到這裡啦!希望大家透過這篇文章對 Lambda Function 有更深入的了解。如果你對文章中提到的操作或應用有任何問題,歡迎在留言區討論,或者分享你使用這個方法解決問題的經驗!也別忘了試試我提供的練習題目喔!祝大家練習順利,我們下次見~


Reference

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.