0Pricing
Pandas & NumPy Academy · บทเรียน

map() และ applymap() สำหรับการดำเนินการทีละองค์ประกอบ

ใช้ฟังก์ชันกับทุกองค์ประกอบของ Series ด้วย map() และกับทุกเซลล์ของ DataFrame ด้วย applymap()

map() และ applymap() สำหรับการดำเนินการทีละองค์ประกอบ เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

ภาพรวมของ Series.map()

Series.map() ใช้ฟังก์ชัน พจนานุกรม หรือ Series อื่นกับสมาชิกทุกตัวของ Series และคืนค่าเป็น Series ใหม่ ต่างจาก apply() ซึ่งสามารถรับอ็อบเจ็กต์ที่ซับซ้อนได้ เพราะ map() จะทำงานกับค่าหนึ่งค่าในแต่ละครั้งเสมอ เครื่องมือนี้เป็นมาตรฐานสำหรับการเข้ารหัสค่าแบบจัดหมวดหมู่ การค้นหาป้ายกำกับจากตารางจับคู่ หรือการแปลงค่าอย่างง่ายทีละสมาชิก

import pandas as pd

codes = pd.Series(['N', 'S', 'E', 'N', 'W'])
region_names = {'N': 'North', 'S': 'South', 'E': 'East', 'W': 'West'}

names = codes.map(region_names)
print(names)

map() กับฟังก์ชัน

ส่งฟังก์ชัน (รวมถึง lambda) ให้กับ map() เมื่อการแปลงค่าต้องอาศัยตรรกะ ไม่ใช่ตารางค้นหา ฟังก์ชันจะได้รับค่าทีละค่า จึงไม่สามารถเข้าถึงแถวหรือคอลัมน์อื่นได้ สำหรับการกำหนดป้ายกำกับตามเงื่อนไขอย่างง่าย การใช้ map() กับฟังก์ชันจะอ่านง่ายกว่าการใช้ลูป แต่จะช้ากว่า np.where() เมื่อใช้กับ Series ขนาดใหญ่

prices = pd.Series([5.0, 25.0, 80.0, 150.0])

category = prices.map(lambda p: 'budget' if p < 20 else 'mid' if p < 100 else 'premium')
print(category)

map() เทียบกับ replace()

ทั้ง map() และ replace() สามารถแทนที่ค่าด้วยพจนานุกรมได้ ความแตกต่างสำคัญคือ map() จะคืนค่า NaN สำหรับค่าที่ไม่พบในพจนานุกรม (เว้นแต่คุณจะใช้ fillna() ภายหลัง) ขณะที่ replace() จะคงค่าที่ไม่ตรงกันไว้เหมือนเดิม ใช้ replace() เมื่อคุณต้องการเปลี่ยนเฉพาะค่าบางค่าและคงค่าอื่นทั้งหมดไว้ตามเดิม

s = pd.Series(['A', 'B', 'C', 'D'])
map_dict = {'A': 'Alpha', 'B': 'Beta'}

print('map():', s.map(map_dict).tolist())      # C,D → NaN
print('replace():', s.replace(map_dict).tolist())  # C,D → unchanged

map() กับ Series (การค้นหาป้ายกำกับ)

คุณสามารถส่ง Series อื่นให้ map() เป็นตารางค้นหาได้ โดยค่าของ Series ที่เรียกใช้จะถูกใช้เป็นคีย์เพื่อค้นหาค่าในดัชนีของ Series ที่ส่งเป็นอาร์กิวเมนต์ นี่เป็นวิธีแบบกระชับในการเชื่อมตารางค้นหาโดยไม่ต้องเรียกใช้ merge() อย่างเต็มรูปแบบ โดยทำงานเหมือนการค้นหาด้วยพจนานุกรมแบบเวกเตอร์ ซึ่งตารางค้นหามีดัชนีเป็นคีย์

prices_lookup = pd.Series(
    [10.0, 25.0, 50.0],
    index=['SKU-001', 'SKU-002', 'SKU-003']
)

orders = pd.Series(['SKU-002', 'SKU-001', 'SKU-003', 'SKU-001'])
order_prices = orders.map(prices_lookup)
print(order_prices)

DataFrame.applymap() สำหรับการดำเนินการทีละเซลล์

DataFrame.applymap() (เรียกว่า DataFrame.map() ใน Pandas 2.1 ขึ้นไป) ใช้ฟังก์ชันกับทุกเซลล์ของ DataFrame ทีละเซลล์ ต่างจาก apply(axis=0) ซึ่งได้รับทั้งคอลัมน์ เพราะ applymap() จะได้รับค่าทีละค่า วิธีนี้มีประโยชน์สำหรับการจัดรูปแบบเซลล์ทั้งหมดให้สอดคล้องกัน เช่น ปัดเศษเซลล์ตัวเลขทุกเซลล์ให้เหลือทศนิยม 2 ตำแหน่ง หรือเปลี่ยนเซลล์ข้อความทุกเซลล์ให้เป็นตัวพิมพ์เล็ก

df = pd.DataFrame({
    'a': [1.234, 5.678, 9.012],
    'b': [3.456, 7.890, 2.345]
})

# Round every cell to 1 decimal place
df_rounded = df.applymap(lambda x: round(x, 1))
print(df_rounded)

applymap() สำหรับการจัดรูปแบบข้อความ

ใช้การจัดรูปแบบข้อความที่สอดคล้องกันกับทุกเซลล์ของ DataFrame ที่มีข้อความหลายรูปแบบ เช่น เปลี่ยนค่าทั้งหมดเป็นรูปแบบตัวอักษรขึ้นต้นคำด้วยตัวพิมพ์ใหญ่ หรือเปลี่ยน None เป็นสตริงว่าง applymap(str.strip) จะลบช่องว่างจากทุกเซลล์ทั่วทั้ง DataFrame ด้วยการเรียกใช้เพียงครั้งเดียว ซึ่งกระชับกว่าการวนซ้ำในแต่ละคอลัมน์แล้วใช้ .str.strip() กับแต่ละคอลัมน์แยกกันมาก

df_str = pd.DataFrame({
    'name': [' Alice ', 'Bob  ', '  Carol'],
    'city': ['new york ', ' london', 'paris  ']
})

df_clean = df_str.applymap(str.strip)
print(df_clean)

applymap() สำหรับการจัดรูปแบบสกุลเงิน

เมื่อเตรียม DataFrame เพื่อแสดงในรายงาน ให้จัดรูปแบบเซลล์ตัวเลขเป็นสตริงสกุลเงินด้วย applymap() วิธีนี้จะแปลงตัวเลขเป็นสตริงที่พร้อมแสดงผลโดยไม่เปลี่ยนชนิดข้อมูลพื้นฐาน การแปลงนี้มีไว้สำหรับผลลัพธ์สุดท้ายเท่านั้น ให้ดำเนินการเป็นขั้นตอนสุดท้ายก่อนเรียกใช้ to_excel() หรือ to_html() เพื่อส่งออกตารางที่จัดรูปแบบแล้ว

revenue_table = pd.DataFrame({
    'North': [12300.0, 9800.0],
    'South': [7400.0, 11200.0]
}, index=['Q1', 'Q2'])

formatted = revenue_table.applymap(lambda x: f'${x:,.0f}')
print(formatted)

Pandas 2.1: เปลี่ยนชื่อ applymap เป็น map

ใน Pandas 2.1 DataFrame.applymap() ถูกเปลี่ยนชื่อเป็น DataFrame.map() เพื่อให้สอดคล้องกับ Series.map() ส่วน applymap() แบบเดิมยังใช้งานได้ แต่จะแสดงคำเตือนว่าเลิกใช้แล้ว ในโค้ดใช้งานจริง ให้ตรวจสอบรุ่นของ Pandas และใช้ df.map(func) หากเป็นรุ่น 2.1 ขึ้นไป เพื่อหลีกเลี่ยงคำเตือนการเลิกใช้ในรุ่นต่อ ๆ ไป

import pandas as pd

print('Pandas version:', pd.__version__)

# Forward-compatible pattern:
if hasattr(pd.DataFrame, 'map'):
    df_clean = df_str.map(str.strip)  # Pandas 2.1+
else:
    df_clean = df_str.applymap(str.strip)  # Pandas < 2.1

print(df_clean)

map() สำหรับการเข้ารหัสคุณลักษณะแบบจัดหมวดหมู่

แบบจำลองการเรียนรู้ของเครื่องต้องใช้ข้อมูลนำเข้าเป็นตัวเลข ดังนั้นคอลัมน์แบบจัดหมวดหมู่จึงต้องถูกเข้ารหัส ใช้ map() ร่วมกับพจนานุกรมสำหรับเข้ารหัสเป็นจำนวนเต็ม เพื่อแปลงหมวดหมู่เป็นตัวเลขตามลำดับก่อนส่ง DataFrame ให้แบบจำลอง สำหรับหมวดหมู่แบบนามบัญญัติที่ไม่มีลำดับตามธรรมชาติ ควรเลือกใช้ pd.get_dummies() หรือ OneHotEncoder ของ scikit-learn แทน

size_order = {'small': 0, 'medium': 1, 'large': 2, 'enterprise': 3}

df['size_encoded'] = df['order_size'].map(size_order)
print(df[['order_size', 'size_encoded']])

การต่อ map() สำหรับการค้นหาหลายขั้นตอน

ต่อการเรียกใช้ map() สองครั้งเมื่อคุณต้องการค้นหาแบบสองระดับ โดยครั้งแรกแปลงรหัสเป็นคีย์ขั้นกลาง จากนั้นแปลงคีย์ขั้นกลางเป็นป้ายกำกับสุดท้าย ตัวอย่างเช่น แปลง SKU ของสินค้าเป็นรหัสหมวดหมู่ แล้วแปลงรหัสหมวดหมู่เป็นชื่อหมวดหมู่ การต่อการเรียกใช้ map() สองครั้งอ่านง่ายกว่าการใช้พจนานุกรมซ้อนกันหรือการ merge แล้ว merge อีกครั้ง

sku_to_cat_code = {'SKU-001': 'C1', 'SKU-002': 'C2', 'SKU-003': 'C1'}
cat_code_to_name = {'C1': 'Electronics', 'C2': 'Apparel'}

skus = pd.Series(['SKU-001', 'SKU-002', 'SKU-003'])
cat_names = skus.map(sku_to_cat_code).map(cat_code_to_name)
print(cat_names)

การจัดการค่าว่างทีละสมาชิกด้วย map

เมื่อใช้ map(func) ฟังก์ชันจะถูกเรียกใช้แม้กับค่า NaN ซึ่งอาจทำให้เกิด TypeError หากฟังก์ชันไม่รองรับ None ให้ครอบฟังก์ชันด้วยการตรวจสอบค่าว่างโดยใช้ pd.isna(x) หรือใช้พารามิเตอร์ na_action='ignore' ใน map() เพื่อข้ามค่า NaN และคงค่าเหล่านั้นเป็น NaN ในผลลัพธ์โดยไม่เรียกใช้ฟังก์ชัน

s = pd.Series([1.0, None, 3.0, None, 5.0])

# na_action='ignore' skips NaN values
result = s.map(lambda x: x * 2, na_action='ignore')
print(result)

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจแนวคิดการวิเคราะห์ข้อมูลจากบทเรียนนี้

ทบทวนบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับ การใช้ Series.map() เพื่อค้นหาค่าเดี่ยวด้วยฟังก์ชันและพจนานุกรม การใช้ DataFrame.applymap()/map() เพื่อจัดรูปแบบแต่ละเซลล์ในทุกคอลัมน์ และ การทำความเข้าใจความแตกต่างระหว่าง map() กับ replace() ในการจัดการค่าที่ไม่ตรงกัน ลำดับถัดไป เราจะสำรวจการต่อเมธอดด้วย pipe() เพื่อสร้าง pipeline การแปลงข้อมูลที่อ่านง่าย

คำถามที่พบบ่อย

บทเรียน “map() และ applymap() สำหรับการดำเนินการทีละองค์ประกอบ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “map() และ applymap() สำหรับการดำเนินการทีละองค์ประกอบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “map() และ applymap() สำหรับการดำเนินการทีละองค์ประกอบ”

ใช้ฟังก์ชันกับทุกองค์ประกอบของ Series ด้วย map() และกับทุกเซลล์ของ DataFrame ด้วย applymap() คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “map() และ applymap() สำหรับการดำเนินการทีละองค์ประกอบ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. apply() กับคอลัมน์และแถว
  2. apply() กับ GroupBy
  3. map() และ applymap() สำหรับการดำเนินการทีละองค์ประกอบ
  4. การต่อเมธอดด้วย pipe()
← กลับไปที่ Pandas & NumPy Academy