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

การใช้ดัชนีบูลีนกับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การใช้ดัชนีบูลีนกับ DataFrames
  2. เมธอด query()
  3. ตัวกรอง isin() และ between()
  4. การเลือกคอลัมน์ตามรูปแบบชื่อ
← กลับไปที่ Pandas & NumPy Academy