ตัวกรอง isin() และ between()
เลือกแถวที่ค่าคอลัมน์อยู่ในรายการด้วย isin() หรืออยู่ภายในช่วงตัวเลขด้วย between()
ตัวกรอง isin() และ between() เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
ภาพรวมเมธอด isin()
isin() ตรวจสอบว่าแต่ละองค์ประกอบของ Series อยู่ในรายการ (หรือเซต) ค่าที่กำหนดหรือไม่ เมธอดนี้ส่งคืน Series แบบบูลีนที่นำไปใช้กรองแถวได้โดยตรง วิธีนี้กระชับและมักทำงานเร็วกว่าเมื่อเทียบกับการต่อเงื่อนไข == หลายข้อด้วย |
ตัวอย่างเช่น แทนที่จะเขียน (df['country'] == 'USA') | (df['country'] == 'UK') คุณสามารถเขียน df['country'].isin(['USA', 'UK']) ได้
import pandas as pd
df = pd.DataFrame({
'country': ['USA', 'Germany', 'UK', 'France', 'USA'],
'sales': [400, 200, 150, 300, 600]
})
# Check membership
mask = df['country'].isin(['USA', 'UK'])
print(mask.tolist()) # [True, False, True, False, True]
result = df[mask]
print(result)
# country sales
# 0 USA 400
# 2 UK 150
# 4 USA 600การใช้ isin() กับเซตเพื่อเพิ่มความเร็ว
คุณสามารถส่งผ่าน เซตของ Python แทนรายการให้กับ isin() ได้ การค้นหาสมาชิกในเซตใช้เวลา O(1) จึงไม่ช้าลงเมื่อรายการมีขนาดใหญ่ขึ้น เรื่องนี้สำคัญเมื่อรายการค่าที่อนุญาตมีหลายพันรายการ เพราะ isin() ที่ใช้เซตจะเร็วกว่า isin() ที่ใช้รายการอย่างมาก
import pandas as pd
df = pd.DataFrame({
'sku': ['A001', 'B002', 'A003', 'C004', 'B005'],
'qty': [10, 5, 3, 8, 12]
})
# Use a set for fast membership check
allowed_skus = {'A001', 'A003', 'B005'}
result = df[df['sku'].isin(allowed_skus)]
print(result)
# sku qty
# 0 A001 10
# 2 A003 3
# 4 B005 12การปฏิเสธ isin() ด้วย ~
ใช้ isin() ร่วมกับตัวดำเนินการ ~ เพื่อกรองแถวที่คอลัมน์ไม่มีค่าที่ระบุ วิธีนี้เป็นวิธีที่สะอาดที่สุดในการ ตัดออก ซึ่งเป็นรายการค่าเฉพาะ และอ่านเข้าใจง่ายกว่าการสร้างเงื่อนไข != ต่อกันหลายข้ออย่างมาก
import pandas as pd
df = pd.DataFrame({
'status': ['active', 'cancelled', 'shipped', 'refunded', 'active'],
'amount': [100, 200, 300, 150, 500]
})
bad_statuses = ['cancelled', 'refunded']
# Keep all rows NOT in the excluded list
result = df[~df['status'].isin(bad_statuses)]
print(result)
# status amount
# 0 active 100
# 2 shipped 300
# 4 active 500การใช้คอลัมน์ของ DataFrame เป็นรายการให้ isin()
เทคนิคที่มีประสิทธิภาพคือการส่งค่าจาก คอลัมน์ของ DataFrame อื่น ให้กับ isin() ซึ่งเทียบเท่ากับ semi-join ใน SQL โดยเก็บแถวใน df1 ที่คีย์ปรากฏอยู่ใน df2 ต่างจากการผสานข้อมูลแบบเต็ม วิธีนี้จะไม่ทำให้แถวซ้ำหรือเพิ่มคอลัมน์ แต่จะกรองข้อมูลเท่านั้น
import pandas as pd
orders = pd.DataFrame({
'order_id': [1, 2, 3, 4, 5],
'revenue': [100, 200, 300, 400, 500]
})
vip_orders = pd.DataFrame({'order_id': [2, 4]})
# Keep orders whose ID appears in vip_orders
result = orders[orders['order_id'].isin(vip_orders['order_id'])]
print(result)
# order_id revenue
# 1 2 200
# 3 4 400ภาพรวมเมธอด between()
between(left, right) ส่งคืน Series แบบบูลีนที่มีค่าเป็น True เมื่อค่าอยู่ภายในช่วงปิด [left, right] (โดยค่าเริ่มต้นจะรวมขอบเขตทั้งสองด้าน) เมธอดนี้แทนที่เงื่อนไขสองด้านอย่าง (df['age'] >= 18) & (df['age'] <= 65) ด้วยการเรียกใช้ครั้งเดียวที่อ่านเข้าใจง่าย
พารามิเตอร์ inclusive ใช้ควบคุมการรวมขอบเขต ได้แก่ 'both' (ค่าเริ่มต้น), 'left', 'right' หรือ 'neither'
import pandas as pd
df = pd.DataFrame({
'age': [15, 22, 35, 67, 45, 8]
})
# Select working-age population
result = df[df['age'].between(18, 65)]
print(result)
# age
# 1 22
# 2 35
# 4 45การใช้ between() กับพารามิเตอร์ inclusive
โดยค่าเริ่มต้น จุดปลายทั้งสองด้านจะถูก รวมอยู่ ในช่วง การตั้งค่า inclusive='left' จะไม่รวมขอบเขตด้านขวา ซึ่งมีประโยชน์กับช่วงเปิดด้านหนึ่ง เช่น ช่วงแบ่งเวลา ส่วน inclusive='right' จะไม่รวมขอบเขตด้านซ้าย และ inclusive='neither' จะไม่รวมจุดปลายทั้งสองด้านสำหรับช่วงเปิดอย่างเคร่งครัด
import pandas as pd
df = pd.DataFrame({'score': [0, 50, 100, 75, 50]})
# Include only scores strictly between 50 and 100
strict = df[df['score'].between(50, 100, inclusive='neither')]
print(strict)
# score
# 3 75
# Include 50 but not 100
left_closed = df[df['score'].between(50, 100, inclusive='left')]
print(left_closed)
# score
# 1 50
# 3 75
# 4 50การใช้ between() กับคอลัมน์วันที่
between() ใช้กับ คอลัมน์ datetime ได้เช่นกัน คุณสามารถส่งสตริงวันที่หรือออบเจ็กต์ Timestamp เป็นขอบเขต แล้ว Pandas จะเปรียบเทียบค่าของ datetime ที่อยู่เบื้องหลังให้ วิธีนี้เป็นแนวทางที่สะอาดในการเลือกช่วงเวลาโดยไม่ต้องแปลงวันที่เป็นจำนวนเต็ม
import pandas as pd
df = pd.DataFrame({
'date': pd.to_datetime(['2024-01-01', '2024-06-15', '2024-11-20', '2025-03-01']),
'value': [10, 20, 30, 40]
})
# Filter rows in the year 2024
result = df[df['date'].between('2024-01-01', '2024-12-31')]
print(result)
# date value
# 0 2024-01-01 10
# 1 2024-06-15 20
# 2 2024-11-20 30การรวม isin() และ between()
คุณสามารถรวม isin() และ between() ไว้ในนิพจน์บูลีนเดียวกันโดยใช้ & และ | ทำให้ได้ตัวกรองที่กระชับและอ่านง่าย แทนการใช้เงื่อนไขซ้อนกันหลายชั้น ควรครอบการเรียกใช้แต่ละครั้งด้วยวงเล็บเสมอเมื่อรวมเข้าด้วยกัน
import pandas as pd
df = pd.DataFrame({
'region': ['North', 'South', 'East', 'North', 'West'],
'revenue': [100, 500, 200, 300, 400]
})
# Rows in North or South regions AND revenue between 200 and 400
result = df[
df['region'].isin(['North', 'South']) &
df['revenue'].between(200, 400)
]
print(result)
# region revenue
# 3 North 300
# 1 South 500 <- actually excluded (500 > 400)
# 3 North 300การใช้ isin() กับหลายคอลัมน์ด้วย Any
เมื่อคุณต้องการตรวจสอบว่าคอลัมน์ใดคอลัมน์หนึ่งจากหลายคอลัมน์มีค่าจากรายการหรือไม่ คุณสามารถเรียก isin() กับ DataFrame ทั้งหมด แล้วใช้ .any(axis=1) เพื่อรวมผลลัพธ์ตามแถว วิธีนี้มีประโยชน์สำหรับค้นหาข้ามคอลัมน์แท็กหรือหมวดหมู่หลายคอลัมน์พร้อมกัน
import pandas as pd
df = pd.DataFrame({
'tag1': ['python', 'java', 'sql'],
'tag2': ['sql', 'python', 'go'],
'topic': ['Database', 'Backend', 'Infra']
})
target_langs = ['python', 'sql']
# Check if either tag column matches
mask = df[['tag1', 'tag2']].isin(target_langs).any(axis=1)
result = df[mask]
print(result)
# tag1 tag2 topic
# 0 python sql Database
# 1 java python Backend
# 2 sql go Infraเคล็ดลับด้านประสิทธิภาพ: isin() กับ == หลายเงื่อนไข
สำหรับรายการขนาดเล็กที่มีค่า 2–3 ค่า ความแตกต่างระหว่าง isin() กับเงื่อนไข == ที่ต่อกันนั้นแทบไม่มีนัยสำคัญ แต่สำหรับ รายการขนาดใหญ่ ที่มีค่าหลายร้อยค่า isin() จะเร็วกว่าอย่างมาก เพราะภายในจะแปลงรายการเป็นแฮชเซตและค้นหาแต่ละองค์ประกอบด้วยเวลา O(1) แทนการเปรียบเทียบทีละรายการตามลำดับ
ควรเลือกใช้ isin() แทนเงื่อนไข | ที่ต่อกันยาว ๆ เสมอ เพื่อให้โค้ดสะอาดและมีประสิทธิภาพยิ่งขึ้น
import pandas as pd
import numpy as np
# 1 million row DataFrame
df = pd.DataFrame({'id': np.random.randint(0, 10000, size=1_000_000)})
allowed = list(range(0, 500)) # 500 allowed IDs
# isin() is the right approach here — fast hash lookup
result = df[df['id'].isin(allowed)]
print(result.shape) # around (50000, 1)ตัวกรองจากโลกจริง: แค็ตตาล็อกสินค้า
ต่อไปนี้เป็นตัวอย่างสมจริงที่ใช้ isin() สำหรับกรองหมวดหมู่ และ between() สำหรับกรองช่วงราคา ซึ่งเป็นรูปแบบที่พบได้บ่อยในการวิเคราะห์อีคอมเมิร์ซ ตัวกรองทั้งสองร่วมกันจะเลือกเฉพาะกลุ่มสินค้าที่ต้องการสำหรับการส่งเสริมการขายแบบเจาะจง
import pandas as pd
products = pd.DataFrame({
'name': ['Laptop', 'Mouse', 'Monitor', 'Keyboard', 'Webcam'],
'category': ['Computing', 'Accessories', 'Displays', 'Accessories', 'Peripherals'],
'price': [1200, 25, 300, 80, 150]
})
# Products in Accessories or Peripherals, priced 50-200
eligible = products[
products['category'].isin(['Accessories', 'Peripherals']) &
products['price'].between(50, 200)
]
print(eligible)
# name category price
# 3 Keyboard Accessories 80
# 4 Webcam Peripherals 150ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับตัวกรอง isin() และ between()
ทบทวนบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า isin() ตรวจสอบการเป็นสมาชิกของเซตและเร็วกว่าเงื่อนไข == หลายข้อที่ต่อกัน ~isin() ใช้ตัดรายการค่าออก และ between() ใช้กรองช่วงปิดพร้อมพารามิเตอร์ inclusive ที่เลือกได้ ทั้งสองเมธอดใช้ได้กับคอลัมน์ตัวเลข สตริง และ datetime บทถัดไปเราจะเรียนรู้วิธีเลือกคอลัมน์ DataFrame ที่ตรงกับรูปแบบชื่อ
คำถามที่พบบ่อย
บทเรียน “ตัวกรอง isin() และ between()” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตัวกรอง isin() และ between()” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตัวกรอง isin() และ between()”
เลือกแถวที่ค่าคอลัมน์อยู่ในรายการด้วย isin() หรืออยู่ภายในช่วงตัวเลขด้วย between() คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ตัวกรอง isin() และ between()” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การใช้ดัชนีบูลีนกับ DataFrames
- เมธอด query()
- ตัวกรอง isin() และ between()
- การเลือกคอลัมน์ตามรูปแบบชื่อ