Series
คืนเป็น Series ของ True/False (boolean mask) ขนาดเท่าจำนวนแถวเดิม ตัวมันเองยังไม่ใช่ตารางที่กรองแล้วนะครับ ต้องเอาไปครอบ df[…] อีกชั้นถึงจะได้ DataFrame ที่ filter เสร็จ
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| values | list | set | Series | dict | ชุดค่าที่ต้องการเทียบ ปกติผมใส่เป็น list เช่น [‘Bangkok’,’Phuket’] หรือ [10, 20, 30] แต่ละค่าในคอลัมน์จะถูกเช็คว่าอยู่ในชุดนี้ไหม |
ถ้าผมอ่านโค้ด pandas ที่ AI เขียนมา จะเจอ isin บ่อยมากครับ เพราะมันคือวิธีกรองข้อมูลด้วย “หลายค่า” ที่สั้นและอ่านง่ายที่สุด 😎
หน้าที่ของมันตรงไปตรงมา: เอาแต่ละค่าในคอลัมน์ไปเทียบกับ list ที่เราให้ ถ้าค่านั้นอยู่ใน list ก็ได้ True ถ้าไม่อยู่ก็ได้ False ผลที่ออกมาเลยเป็น Series ของ True/False เรียงตามแถวเดิม เราเรียกสิ่งนี้ว่า boolean mask ครับ
ที่เจ๋งคือ มันมาแทน OR ยาวๆ ได้เลย แทนที่จะเขียน (df[‘city’]==’Bangkok’) | (df[‘city’]==’Phuket’) | (df[‘city’]==’Chiang Mai’) เราเขียนแค่ df[‘city’].isin([‘Bangkok’,’Phuket’,’Chiang Mai’]) จบในบรรทัดเดียว อ่านรู้เรื่องกว่าเยอะ เทียบกับ Excel ก็เหมือนเรา filter เลือกหลาย item พร้อมกันในช่องเดียวนั่นแหละครับ
ส่วนตัวผมแทบไม่เคยใช้ isin เดี่ยวๆ หรอกครับ ส่วนใหญ่เอา mask ที่ได้ไปครอบ df[…] เพื่อกรองแถวจริงๆ เลย เดี๋ยวในตัวอย่างผมจะให้ดูทั้งสองแบบ — แบบได้ mask ดิบๆ กับแบบเอาไปกรองตาราง ✨
ผมเช็คคอลัมน์ city ว่าแต่ละแถวเป็น Bangkok หรือ Phuket ไหม ผลที่ได้คือ Series ของ True/False เรียงตามแถวเดิมเลยครับ แถวไหนเข้าเงื่อนไขได้ True ไม่เข้าได้ False ตัวนี้แหละที่เรียกว่า boolean mask
อันนี้คือท่าที่ผมใช้จริงบ่อยสุดครับ เอา mask จากตัวอย่างที่แล้วมาครอบ df[…] อีกที pandas จะเก็บไว้เฉพาะแถวที่เป็น True คือ Bangkok กับ Phuket ได้ DataFrame ที่กรองเสร็จออกมาเลย เหมือนกด Filter ใน Excel แล้วเลือกแค่ 2 เมืองนี้
บางทีผมอยากได้ตรงข้าม คือเอาแถวที่ไม่อยู่ใน list ก็เติม ~ (tilde) ไว้ข้างหน้าเพื่อพลิก True เป็น False คราวนี้เลยเหลือ Chiang Mai กับ Khon Kaen แทน เหมือน NOT IN ใน SQL ครับ
isin ใช้กับตัวเลขได้เหมือนกันครับ ผมกรองเอาเฉพาะแถวที่ qty เท่ากับ 10 หรือ 40 เหลือสินค้า A, C (qty 10) และ D (qty 40) ส่วน B ที่เป็น 25 ถูกตัดทิ้งเพราะไม่อยู่ใน list
ผลลัพธ์เหมือนกันเป๊ะครับ แต่ isin อ่านง่ายกว่าและสั้นกว่ามากเมื่อค่ามีหลายตัว ลองนึกภาพถ้าต้องเช็ค 10 เมือง เขียน == ต่อด้วย | สิบรอบนี่ตาลายเลยครับ ส่วน isin แค่ใส่ list เข้าไปทีเดียวจบ แถมถ้าค่าที่จะเช็คเก็บอยู่ในตัวแปร list อยู่แล้ว ก็ส่งเข้า isin ได้ตรงๆ ไม่ต้องมานั่งต่อ string เงื่อนไขเอง
เพราะ isin คืนมาแค่ Series ของ True/False (mask) ไม่ได้กรองตารางให้เองครับ ชั้นในคือ df['col'].isin([…]) สร้าง mask ส่วนชั้นนอก df[…] เอา mask นั้นไปบอก pandas ว่า "เก็บเฉพาะแถวที่ True" สองชั้นนี้เลยทำงานคนละหน้าที่กัน พอเข้าใจแล้วจะอ่านโค้ด pandas ออกเกือบหมดเลยครับ เพราะ pattern นี้ใช้กันทั่วไปมาก
ทำได้ครับ ถ้าเรียก .isin() บนทั้ง DataFrame เช่น df.isin([10, 40]) มันจะเช็คทุกช่องทุกคอลัมน์แล้วคืน DataFrame ของ True/False ขนาดเท่าเดิมเลย แต่ในงานกรองแถวจริงๆ ผมมักเช็คทีละคอลัมน์อย่าง df['col'].isin([…]) มากกว่า เพราะคุมง่ายและตรงกับสิ่งที่อยากได้
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas isin จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
numpy.where ผมใช้เลือกค่าจาก array ตามเงื่อนไขที่กำหนดครับ ถ้าให้เทียบง่ายๆ มันคือ IF ใน Excel นั่นแหละ แต่เก่งกว่าตรงที่ทำงานกับข้อมูลทั้ง array พร้อมกันในทีเดียว แถมยังใส่อาร์กิวเมนต์เดียวเพื่อหา index ที่ตรงเงื่อนไขได้อีกด้วย
between ใน pandas ผมใช้เช็คว่าค่าในคอลัมน์อยู่ในช่วง [left, right] หรือเปล่า คืนออกมาเป็น Series ของ True/False (เรียกว่า boolean mask) เอาไปกรองแถวต่อได้เลย ถ้าใครเคยเขียนเงื่อนไขใน Excel แบบ ยอด >= 100 AND <= 500 ตัวนี้คือคำสั่งสั้นๆ ที่ทำแบบนั้นให้ในบรรทัดเดียวครับ
df.loc ใน pandas ผมใช้สำหรับเลือกข้อมูลจาก DataFrame โดยระบุ label ของแถวและคอลัมน์ ไม่ว่าจะเลือกแถวเดียว หลายแถว หรือกรองด้วยเงื่อนไข Boolean เหมือนการกด Ctrl+F ใน Excel แต่ทรงพลังกว่ามากครับ
query ใน pandas ผมใช้กรองแถวใน DataFrame ด้วยข้อความเงื่อนไขที่อ่านง่ายเหมือนพูดภาษาคน แทนที่จะเขียน boolean mask ยาวๆ ให้ตาลาย เหมาะมากกับเงื่อนไขซับซ้อนหลายข้อที่อยากให้โค้ดสั้นและอ่านรู้เรื่องครับ
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่