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 → unchangedmap() กับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- apply() กับคอลัมน์และแถว
- apply() กับ GroupBy
- map() และ applymap() สำหรับการดำเนินการทีละองค์ประกอบ
- การต่อเมธอดด้วย pipe()