isin ใน pandas ผมใช้เช็คว่าแต่ละค่าในคอลัมน์ตรงกับค่าใน list ที่กำหนดไหม คืนมาเป็น True/False ทีละแถว ถ้าใครเคย filter หลายค่าพร้อมกันใน Excel หรือเขียน OR หลายเงื่อนไขซ้อนๆ กัน ตัวนี้คือทางลัดที่สะอาดกว่ามากครับ
df['col'].isin(values)
df['col'].isin(values)
Series
คืนเป็น Series ของ True/False (boolean mask) ขนาดเท่าจำนวนแถวเดิม ตัวมันเองยังไม่ใช่ตารางที่กรองแล้วนะครับ ต้องเอาไปครอบ df[…] อีกชั้นถึงจะได้ DataFrame ที่ filter เสร็จ
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| values | list | set | Series | dict | Yes | ชุดค่าที่ต้องการเทียบ ปกติผมใส่เป็น list เช่น [‘Bangkok’,’Phuket’] หรือ [10, 20, 30] แต่ละค่าในคอลัมน์จะถูกเช็คว่าอยู่ในชุดนี้ไหม |
df['city'].isin(['Bangkok','Phuket'])df['city'].isin(['Bangkok','Phuket'])
0 True
1 True
2 False
3 False
Name: city, dtype: bool
df[df['city'].isin(['Bangkok','Phuket'])]df[df['city'].isin(['Bangkok','Phuket'])]
city sales
0 Bangkok 100
1 Phuket 200
df[~df['city'].isin(['Bangkok','Phuket'])]df[~df['city'].isin(['Bangkok','Phuket'])]
city sales
2 Chiang Mai 150
3 Khon Kaen 80
df[df['qty'].isin([10, 40])]df[df['qty'].isin([10, 40])]
product qty
0 A 10
2 C 10
3 D 40
ผลลัพธ์เหมือนกันเป๊ะครับ แต่ 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 ที่ 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 ดิบๆ กับแบบเอาไปกรองตาราง ✨