การใช้ดัชนีบูลีนกับ DataFrames
กรองแถวด้วยการใช้เงื่อนไขบูลีนกับคอลัมน์ และรวมหลายเงื่อนไขด้วยตัวดำเนินการ & และ |
การใช้ดัชนีบูลีนกับ DataFrames เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
การทำดัชนีแบบบูลีนคืออะไร
การทำดัชนีแบบบูลีนช่วยให้คุณกรองแถวใน DataFrame ได้ด้วยการใช้เงื่อนไขที่สร้าง Series ของค่า True และ False ระบบจะแสดงเฉพาะแถวที่เงื่อนไขเป็น True เท่านั้น วิธีนี้เป็นเทคนิคการเลือกข้อมูลที่ใช้บ่อยที่สุดอย่างหนึ่งใน Pandas เพราะทั้งอ่านเข้าใจง่ายและทำงานรวดเร็ว
ตัวอย่างเช่น เมื่อมี DataFrame ยอดขาย คุณสามารถดึงแถวทั้งหมดที่รายรับมากกว่า 1000 ได้ทันทีโดยไม่ต้องเขียนลูป
import pandas as pd
df = pd.DataFrame({
'product': ['A', 'B', 'C', 'D'],
'revenue': [500, 1500, 800, 2000]
})
# Boolean condition produces a Series of True/False
mask = df['revenue'] > 1000
print(mask)
# 0 False
# 1 True
# 2 False
# 3 Trueการใช้มาสก์บูลีน
เมื่อคุณมีมาสก์บูลีนแล้ว ให้ส่งมาสก์นั้นไว้ในวงเล็บเหลี่ยมของ DataFrame เพื่อเลือกเฉพาะแถวที่ตรงกัน ผลลัพธ์จะเป็น DataFrame ใหม่ โดยข้อมูลต้นฉบับจะไม่ถูกแก้ไข ดัชนีแถวจากต้นฉบับจะยังคงเดิม คุณจึงทราบได้เสมอว่าแต่ละแถวมาจากที่ใด
รูปแบบนี้ — สร้างมาสก์ แล้วจึงนำไปใช้ — เป็นสำนวนมาตรฐานของ Pandas สำหรับการกรองแถว
import pandas as pd
df = pd.DataFrame({
'product': ['A', 'B', 'C', 'D'],
'revenue': [500, 1500, 800, 2000]
})
mask = df['revenue'] > 1000
filtered = df[mask]
print(filtered)
# product revenue
# 1 B 1500
# 3 D 2000เงื่อนไขแบบอินไลน์โดยไม่ใช้ตัวแปรมาสก์
คุณไม่จำเป็นต้องกำหนด Boolean Series ให้กับตัวแปร คุณสามารถเขียนเงื่อนไขแบบอินไลน์ไว้ภายในวงเล็บเหลี่ยมได้โดยตรง: df[df['col'] > value] รูปแบบบรรทัดเดียวนี้พบได้บ่อยในสมุดบันทึกวิเคราะห์ข้อมูล เพราะทำให้โค้ดกระชับและอ่านง่าย
ทั้งสองแนวทาง — ใช้ตัวแปรมาสก์และใช้แบบอินไลน์ — ให้ผลลัพธ์เหมือนกัน ใช้ตัวแปรเมื่อเงื่อนไขซับซ้อนหรือต้องใช้ซ้ำ และใช้แบบอินไลน์สำหรับตัวกรองง่าย ๆ ที่ใช้ครั้งเดียว
import pandas as pd
df = pd.DataFrame({
'city': ['NYC', 'LA', 'Chicago', 'Houston'],
'population': [8_336_817, 3_979_576, 2_693_976, 2_320_268]
})
# Inline boolean filter
large_cities = df[df['population'] > 3_000_000]
print(large_cities)
# city population
# 0 NYC 8336817
# 1 LA 3979576การรวมเงื่อนไขด้วย & (AND)
หากต้องการให้ทั้งสองเงื่อนไขเป็นจริง ให้รวมเงื่อนไขด้วยตัวดำเนินการ & — อย่าใช้คีย์เวิร์ด and ของ Python ซึ่งไม่ทำงานแบบสมาชิกต่อสมาชิกกับอาร์เรย์ แต่ละเงื่อนไขต้องครอบด้วยวงเล็บ เนื่องจาก & มีลำดับความสำคัญของตัวดำเนินการสูงกว่าตัวดำเนินการเปรียบเทียบ
ผลลัพธ์จะเก็บเฉพาะแถวที่ทุกเงื่อนไขย่อยประเมินแล้วได้ค่า True
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Carol', 'Dave'],
'age': [25, 35, 28, 45],
'salary': [50000, 90000, 70000, 120000]
})
# Both conditions must be true
result = df[(df['age'] > 27) & (df['salary'] > 60000)]
print(result)
# name age salary
# 1 Bob 35 90000
# 2 Carol 28 70000การรวมเงื่อนไขด้วย | (OR)
ใช้ตัวดำเนินการ | เพื่อเก็บแถวที่มีเงื่อนไขเป็นจริงอย่างน้อยหนึ่งข้อ เช่นเดียวกับ & แต่ละเงื่อนไขย่อยต้องอยู่ภายในวงเล็บ ตัวดำเนินการ | จะทำ OR เชิงตรรกะแบบสมาชิกต่อสมาชิกกับอาร์เรย์บูลีน
การใช้ & และ | ร่วมกันทำได้อย่างถูกต้อง เพียงระวังการใส่วงเล็บเพื่อกำหนดลำดับการประเมินให้ถูกต้องและหลีกเลี่ยงข้อผิดพลาดทางตรรกะที่สังเกตได้ยาก
import pandas as pd
df = pd.DataFrame({
'product': ['Laptop', 'Mouse', 'Monitor', 'Keyboard'],
'price': [1200, 25, 300, 80],
'category': ['Electronics', 'Accessories', 'Electronics', 'Accessories']
})
# Rows where price > 200 OR category is Accessories
result = df[(df['price'] > 200) | (df['category'] == 'Accessories')]
print(result)
# product price category
# 0 Laptop 1200 Electronics
# 1 Mouse 25 Accessories
# 2 Monitor 300 Electronics
# 3 Keyboard 80 Accessoriesการปฏิเสธเงื่อนไขด้วย ~
ตัวดำเนินการตัวหนอน ~ จะกลับค่าของ Boolean Series จาก True เป็น False และในทางกลับกัน ใช้ ~ เพื่อแสดงตรรกะ 'NOT' โดยเก็บแถวที่ไม่ตรงกับเงื่อนไข วิธีนี้สะอาดกว่าการสร้างเงื่อนไขตรงข้ามด้วยตนเอง
ตัวอย่างเช่น df[~df['status'].isin(['cancelled', 'refunded'])] จะเก็บทุกแถวยกเว้นแถวที่มีสถานะสองรายการดังกล่าว
import pandas as pd
df = pd.DataFrame({
'order_id': [1, 2, 3, 4],
'status': ['shipped', 'cancelled', 'delivered', 'refunded']
})
# Keep only rows that are NOT cancelled
active = df[~(df['status'] == 'cancelled')]
print(active)
# order_id status
# 0 1 shipped
# 2 3 delivered
# 3 4 refundedการกรองค่าข้อความ
การทำดัชนีแบบบูลีนทำงานกับคอลัมน์ข้อความได้เช่นกัน คุณสามารถกรองค่าที่ตรงกันทุกประการด้วย == หรือใช้เมธอด .str เช่น .str.startswith(), .str.contains() หรือ .str.upper() ภายในเงื่อนไขเพื่อกรองข้อความได้ยืดหยุ่นยิ่งขึ้น
โดยค่าเริ่มต้น การเปรียบเทียบสตริงใน Pandas คำนึงถึงตัวพิมพ์เล็กใหญ่ ดังนั้น 'NYC' และ 'nyc' จะถือเป็นค่าที่แตกต่างกัน หากจำเป็น ให้ปรับรูปแบบตัวพิมพ์ให้เป็นมาตรฐานก่อน
import pandas as pd
df = pd.DataFrame({
'country': ['USA', 'Germany', 'UK', 'USA', 'France'],
'sales': [400, 200, 150, 600, 300]
})
# Filter rows where country equals USA
us_sales = df[df['country'] == 'USA']
print(us_sales)
# country sales
# 0 USA 400
# 3 USA 600
# Filter rows where country starts with 'G'
g_countries = df[df['country'].str.startswith('G')]
print(g_countries)
# country sales
# 1 Germany 200การกรองหลายคอลัมน์
การวิเคราะห์ที่ซับซ้อนมักต้องใช้เงื่อนไขจากหลายคอลัมน์ร่วมกับ & และ | แบ่งเงื่อนไขที่ยาวมากออกเป็น Boolean Series ที่ตั้งชื่อเพื่อให้อ่านง่าย โดยให้แต่ละรายการทำหน้าที่เป็นตัวกรองย่อยที่มีชื่อ แล้วค่อยนำมารวมกันในตอนท้าย
แนวทางนี้ทำให้เจตนาของโค้ดชัดเจน แต่ละบรรทัดจะอ่านได้คล้ายประโยคภาษาไทยที่อธิบายส่วนหนึ่งของตรรกะการกรอง
import pandas as pd
df = pd.DataFrame({
'region': ['North', 'South', 'North', 'East'],
'year': [2022, 2023, 2023, 2022],
'profit': [5000, -200, 8000, 3000]
})
is_north = df['region'] == 'North'
is_2023 = df['year'] == 2023
is_profitable = df['profit'] > 0
result = df[is_north & is_2023 & is_profitable]
print(result)
# region year profit
# 2 North 2023 8000การใช้ np.where สำหรับคอลัมน์ตามเงื่อนไข
การทำดัชนีแบบบูลีนใช้กรองแถว แต่บางครั้งคุณอาจต้องการเพิ่มคอลัมน์ใหม่ตามเงื่อนไขแทนการลบแถวออก np.where(condition, value_if_true, value_if_false) เป็นรูปแบบเวกเตอร์ที่เทียบเท่ากับ if/else ซึ่งนำไปใช้กับสมาชิกแต่ละตัวในคอลัมน์ และทำงานได้เร็วกว่าการใช้ apply กับแลมบ์ดามาก
import pandas as pd
import numpy as np
df = pd.DataFrame({
'score': [45, 72, 88, 61, 95]
})
# Create a new column based on a condition
df['grade'] = np.where(df['score'] >= 70, 'Pass', 'Fail')
print(df)
# score grade
# 0 45 Fail
# 1 72 Pass
# 2 88 Pass
# 3 61 Fail
# 4 95 Passการกำหนดค่าให้ชุดย่อยที่กรองแล้ว
คุณสามารถอัปเดตค่าในแถวที่กรองแล้วได้โดยตรงด้วย .loc[mask, column] นี่เป็นวิธีที่ปลอดภัยในการกำหนดค่าให้ชุดย่อย — การทำดัชนีต่อเนื่องอย่าง df[mask]['col'] = value อาจทำให้เกิด SettingWithCopyWarning เพราะดำเนินการกับสำเนา
โปรดเลือกใช้ df.loc[mask, 'col'] = value เสมอเมื่อต้องการแก้ไข DataFrame ต้นฉบับโดยตรง
import pandas as pd
df = pd.DataFrame({
'item': ['A', 'B', 'C', 'D'],
'stock': [0, 5, 0, 12]
})
# Mark out-of-stock items
df.loc[df['stock'] == 0, 'status'] = 'Out of Stock'
df.loc[df['stock'] > 0, 'status'] = 'Available'
print(df)
# item stock status
# 0 A 0 Out of Stock
# 1 B 5 Available
# 2 C 0 Out of Stock
# 3 D 12 Availableการนับและหาผลรวมของมาสก์
เนื่องจากค่าบูลีนมีค่าเป็น 1 (True) และ 0 (False) ภายในระบบ คุณจึงสามารถเรียก .sum() กับมาสก์เพื่อนับแถวที่ตรงกัน หรือเรียก .mean() เพื่อหาสัดส่วนของแถวที่ตรงกันได้ การนับอย่างรวดเร็วเหล่านี้ช่วยให้คุณตรวจสอบตรรกะของตัวกรองก่อนนำไปใช้เลือกแถว
import pandas as pd
df = pd.DataFrame({'value': [10, 55, 30, 80, 20, 70]})
mask = df['value'] > 40
print('Count of rows > 40:', mask.sum()) # 3
print('Fraction > 40:', mask.mean().round(2)) # 0.5
# Now apply
print(df[mask])
# value
# 1 55
# 3 80
# 5 70ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับการทำดัชนีแบบบูลีนบน DataFrames
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า มาสก์บูลีนใช้กรองแถวโดยใช้เงื่อนไขกับคอลัมน์ ตัวดำเนินการ & และ |ใช้รวมหลายเงื่อนไข (ไม่ใช่ and/or ของ Python) และ ~ ใช้กลับค่ามาสก์บูลีนเพื่อใช้ตรรกะ NOT ใช้ df.loc[mask, col] = value เพื่อกำหนดค่าให้แถวที่กรองแล้วอย่างปลอดภัย บทถัดไป เราจะสำรวจเมธอด query() สำหรับเขียนตัวกรองเป็นสตริงที่อ่านเข้าใจง่าย
คำถามที่พบบ่อย
บทเรียน “การใช้ดัชนีบูลีนกับ DataFrames” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การใช้ดัชนีบูลีนกับ DataFrames” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การใช้ดัชนีบูลีนกับ DataFrames”
กรองแถวด้วยการใช้เงื่อนไขบูลีนกับคอลัมน์ และรวมหลายเงื่อนไขด้วยตัวดำเนินการ & และ | คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การใช้ดัชนีบูลีนกับ DataFrames” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การใช้ดัชนีบูลีนกับ DataFrames
- เมธอด query()
- ตัวกรอง isin() และ between()
- การเลือกคอลัมน์ตามรูปแบบชื่อ