between ใน pandas ผมใช้เช็คว่าค่าในคอลัมน์อยู่ในช่วง [left, right] หรือเปล่า คืนออกมาเป็น Series ของ True/False (เรียกว่า boolean mask) เอาไปกรองแถวต่อได้เลย ถ้าใครเคยเขียนเงื่อนไขใน Excel แบบ ยอด >= 100 AND <= 500 ตัวนี้คือคำสั่งสั้นๆ ที่ทำแบบนั้นให้ในบรรทัดเดียวครับ
Series
between คืนเป็น Series ของ True/False (boolean mask) ที่ยาวเท่าจำนวนแถวเดิมครับ — ตัวมันเองยังไม่ได้กรองอะไร ต้องเอาไปใส่ใน df[…] อีกทีถึงจะได้แถวที่เข้าเงื่อนไขจริง
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| left | scalar | ขอบล่างของช่วง เช่น 100 หรือวันที่ ‘2024-01-01’ โดยปกติจะนับค่านี้เข้าช่วงด้วย (inclusive) | |
| right | scalar | ขอบบนของช่วง เช่น 500 หรือวันที่ ‘2024-12-31’ โดยปกติจะนับค่านี้เข้าช่วงด้วย (inclusive) | |
| [inclusive]ไม่บังคับ | str | both | กำหนดว่าจะนับขอบเข้าช่วงไหม รับค่า ‘both’ (ค่าเริ่มต้น นับทั้งสองฝั่ง), ‘neither’ (ไม่นับทั้งคู่), ‘left’ (นับเฉพาะขอบล่าง), ‘right’ (นับเฉพาะขอบบน) |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
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 ได้ครับ
ผมเช็คคอลัมน์ sales ว่าค่าไหนอยู่ในช่วง 100 ถึง 500 บ้าง ผลที่ได้คือ Series ของ True/False ยาวเท่าจำนวนแถวเดิม — แถว A (80) ได้ False เพราะต่ำกว่า 100, แถว B (100) กับ C (300) ได้ True, ส่วน D (600) ได้ False เพราะเกิน 500 ครับ ตัว Series นี้แหละที่เราเรียกว่า mask
คราวนี้ผมเอา mask จากตัวอย่างที่แล้วมาใส่ใน df[…] เพื่อให้มันกรองเอาเฉพาะแถวที่เป็น True ออกมา ผลที่ได้คือ DataFrame ที่เหลือแค่แถว B กับ C ครับ — นี่คือ pattern ที่ผมใช้บ่อยสุด คือ between สร้าง mask แล้วเอามากรองตารางในขั้นตอนเดียว
ปกติ between นับขอบ 100 และ 500 เข้าช่วงด้วย แต่พอผมใส่ inclusive='neither' มันจะตัดขอบทั้งสองฝั่งทิ้ง เหลือเฉพาะค่าที่ มากกว่า 100 และ น้อยกว่า 500 จริงๆ — ผลคือแถว B (100) เปลี่ยนจาก True เป็น False เพราะตอนนี้ไม่นับค่าที่เท่ากับขอบล่างแล้วครับ
between ไม่ได้ใช้ได้แค่กับตัวเลขนะครับ ใช้กับวันที่ก็ได้เหมือนกัน ผมกรองเอาเฉพาะ order ที่วันที่อยู่ในช่วง มีนาคม–กันยายน 2024 ผลที่ได้เหลือแค่แถว y (15 มิ.ย.) แถวเดียว เพราะอีกสองแถวอยู่นอกช่วง — เวลาทำรายงานตามช่วงเวลา ผมใช้ท่านี้บ่อยมากครับ
by default นับเข้าไปด้วยครับ คือเป็น inclusive ทั้งสองฝั่ง ค่าที่เท่ากับ left หรือ right พอดีจะได้ True ถ้าผมไม่อยากนับขอบ ก็ใส่ inclusive='neither' หรือจะนับเฉพาะฝั่งเดียวด้วย 'left'/'right' ก็ได้ ผมว่าจุดนี้คนพลาดบ่อย เพราะ Excel บางสูตรไม่นับขอบ แต่ between นับให้เลย
เพราะ between คืนแค่ mask (Series ของ True/False) ที่ยังไม่ได้กรองอะไรครับ ตัว df[…] ข้างนอกต่างหากที่เป็นคนเอา mask ไปเลือกแถวจริง คิดง่ายๆ คือ between = สร้างเงื่อนไข ส่วน df[…] = เอาเงื่อนไขไปกรอง สองหน้าที่คนละขั้นตอนกัน เลยต้องเขียน df ทั้งข้างในและข้างนอกครับ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas between จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
isin ใน pandas ผมใช้เช็คว่าแต่ละค่าในคอลัมน์ตรงกับค่าใน list ที่กำหนดไหม คืนมาเป็น True/False ทีละแถว ถ้าใครเคย filter หลายค่าพร้อมกันใน Excel หรือเขียน OR หลายเงื่อนไขซ้อนๆ กัน ตัวนี้คือทางลัดที่สะอาดกว่ามากครับ
query ใน pandas ผมใช้กรองแถวใน DataFrame ด้วยข้อความเงื่อนไขที่อ่านง่ายเหมือนพูดภาษาคน แทนที่จะเขียน boolean mask ยาวๆ ให้ตาลาย เหมาะมากกับเงื่อนไขซับซ้อนหลายข้อที่อยากให้โค้ดสั้นและอ่านรู้เรื่องครับ
numpy.where ผมใช้เลือกค่าจาก array ตามเงื่อนไขที่กำหนดครับ ถ้าให้เทียบง่ายๆ มันคือ IF ใน Excel นั่นแหละ แต่เก่งกว่าตรงที่ทำงานกับข้อมูลทั้ง array พร้อมกันในทีเดียว แถมยังใส่อาร์กิวเมนต์เดียวเพื่อหา index ที่ตรงเงื่อนไขได้อีกด้วย
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่