between ใน pandas ผมใช้เช็คว่าค่าในคอลัมน์อยู่ในช่วง [left, right] หรือเปล่า คืนออกมาเป็น Series ของ True/False (เรียกว่า boolean mask) เอาไปกรองแถวต่อได้เลย ถ้าใครเคยเขียนเงื่อนไขใน Excel แบบ ยอด >= 100 AND <= 500 ตัวนี้คือคำสั่งสั้นๆ ที่ทำแบบนั้นให้ในบรรทัดเดียวครับ
df['col'].between(left, right)
df['col'].between(left, right)
Series
between คืนเป็น Series ของ True/False (boolean mask) ที่ยาวเท่าจำนวนแถวเดิมครับ — ตัวมันเองยังไม่ได้กรองอะไร ต้องเอาไปใส่ใน df[…] อีกทีถึงจะได้แถวที่เข้าเงื่อนไขจริง
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| left | scalar | Yes | ขอบล่างของช่วง เช่น 100 หรือวันที่ ‘2024-01-01’ โดยปกติจะนับค่านี้เข้าช่วงด้วย (inclusive) | |
| right | scalar | Yes | ขอบบนของช่วง เช่น 500 หรือวันที่ ‘2024-12-31’ โดยปกติจะนับค่านี้เข้าช่วงด้วย (inclusive) | |
| inclusive | str | Optional | both | กำหนดว่าจะนับขอบเข้าช่วงไหม รับค่า ‘both’ (ค่าเริ่มต้น นับทั้งสองฝั่ง), ‘neither’ (ไม่นับทั้งคู่), ‘left’ (นับเฉพาะขอบล่าง), ‘right’ (นับเฉพาะขอบบน) |
df['sales'].between(100, 500)df['sales'].between(100, 500)
0 False
1 True
2 True
3 False
Name: sales, dtype: bool
df[df['sales'].between(100, 500)]df[df['sales'].between(100, 500)]
name sales
1 B 100
2 C 300
df['sales'].between(100, 500, inclusive='neither')df['sales'].between(100, 500, inclusive='neither')
0 False
1 False
2 True
3 False
Name: sales, dtype: bool
df[df['date'].between('2024-03-01', '2024-09-30')]df[df['date'].between('2024-03-01', '2024-09-30')]
order date
1 y 2024-06-15
by default นับเข้าไปด้วยครับ คือเป็น inclusive ทั้งสองฝั่ง ค่าที่เท่ากับ left หรือ right พอดีจะได้ True ถ้าผมไม่อยากนับขอบ ก็ใส่ inclusive=’neither’ หรือจะนับเฉพาะฝั่งเดียวด้วย ‘left’/’right’ ก็ได้ ผมว่าจุดนี้คนพลาดบ่อย เพราะ Excel บางสูตรไม่นับขอบ แต่ between นับให้เลย
เพราะ between คืนแค่ mask (Series ของ True/False) ที่ยังไม่ได้กรองอะไรครับ ตัว df[…] ข้างนอกต่างหากที่เป็นคนเอา mask ไปเลือกแถวจริง คิดง่ายๆ คือ between = สร้างเงื่อนไข ส่วน df[…] = เอาเงื่อนไขไปกรอง สองหน้าที่คนละขั้นตอนกัน เลยต้องเขียน df ทั้งข้างในและข้างนอกครับ
between เป็นหนึ่งในคำสั่งที่ผมเจอบ่อยมากในโค้ด pandas ที่ AI เขียนให้ เพราะมันสั้นและอ่านง่ายกว่าเขียนเงื่อนไข 2 อันมาต่อกันครับ
หน้าที่ของมันคือเช็คทีละค่าในคอลัมน์ว่า อยู่ระหว่าง left กับ right ไหม แล้วคืนเป็น Series ของ True/False ที่ยาวเท่ากับจำนวนแถวเดิม — ตัวนี้แหละที่เรียกว่า boolean mask
ถ้าเทียบกับ Excel ก็เหมือนเราเขียน =AND(A2>=100, A2<=500) ลากลงทุกแถว แต่ between เขียนแค่ df['col'].between(100, 500) ก็จบครับ ไม่ต้องพิมพ์ตัวแปรซ้ำสองรอบ
ที่เจ๋งคือ mask ที่ได้เอาไปใส่ใน df[…] เพื่อ กรองเอาเฉพาะแถวที่เข้าเงื่อนไข ได้ทันที และ between ทำงานได้ทั้งตัวเลขและวันที่ — เวลากรองข้อมูลตามช่วงวันที่ ผมใช้ตัวนี้ประจำเลยครับ 😎
จุดที่ต้องระวังนิดนึง: by default between เป็นแบบ inclusive ทั้งสองฝั่ง คือนับ left และ right เข้าไปด้วย ถ้าอยากเปลี่ยนให้ใช้ argument inclusive ได้ครับ