DataFrame
คืนเป็น DataFrame ที่กรองแถวตามเงื่อนไขแล้วครับ ใช้งานต่อได้เลย (อยากเลือกคอลัมน์ ['name'] ต่อก็ได้)
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| expr | str | นิพจน์เงื่อนไขในรูปแบบ string เช่น ‘score > 70’ หรือ ‘dept == “IT” and score >= 80’ ใช้ and/or/not สำหรับเงื่อนไขหลายข้อ |
query เป็นเมธอดที่ผมชอบเพราะมันทำให้โค้ดกรองข้อมูลอ่านง่ายขึ้นเยอะมากครับ 😎
ลองนึกภาพ แทนที่จะเขียน df[(df[‘score’] > 70) & (df[‘dept’] == ‘IT’)] ที่ยาวและต้องคอยระวังวงเล็บ เราเขียนแค่ df.query(‘score > 70 and dept == “IT”‘) ก็ได้ผลเหมือนกัน อ่านปุ๊บเข้าใจปั๊บ
จุดที่ผมชอบ:
– ใช้ and, or, not ได้เลย ไม่ต้องมานั่งกังวลเรื่อง &, |, ~ ที่ต้องใส่วงเล็บครอบให้ถูก
– ใช้ @ชื่อตัวแปร เพื่อดึงค่าจากตัวแปรนอก DataFrame เข้ามาในเงื่อนไขได้
– ชื่อคอลัมน์ที่มีช่องว่างก็ครอบด้วย backtick เช่น `first name` ได้สบาย
ที่ต้องระวังคือ query ไม่ได้รองรับทุกนิพจน์นะครับ พวกที่ต้องเรียกฟังก์ชันแปลกๆ ที่ไม่ใช่ built-in มันทำไม่ได้ ตรงนั้นต้องกลับไปใช้ boolean mask ปกติแทน 💡
ผมกรองเอาเฉพาะแถวที่ score มากกว่า 70 ครับ ผลที่ได้คือ Alice (85), Carol (92) และ Dave (75) ส่วน Bob ที่ได้ 60 ก็หลุดออกไป เขียนเงื่อนไขเป็นข้อความตรงๆ อ่านง่ายกว่าเยอะ
คราวนี้ผมใช้ and เชื่อมสองเงื่อนไข กรองเอาคนที่อยู่แผนก IT และคะแนนตั้งแต่ 80 ขึ้นไป ได้ Alice กับ Carol ครับ สังเกตว่า Eve อยู่ IT ก็จริง แต่คะแนนแค่ 55 เลยตกเงื่อนไขไป เห็นไหมครับว่าอ่านง่ายกว่าใส่ & กับวงเล็บเยอะ
ทริคที่ผมใช้บ่อยคือใส่ @min_score เพื่อดึงค่าจากตัวแปร min_score ที่ตั้งไว้นอก DataFrame เข้ามาในเงื่อนไข พอ min_score = 70 ก็เลยได้ Alice, Carol, Dave เหมือนเดิม ข้อดีคือถ้าจะเปลี่ยนเกณฑ์ ก็แก้แค่ตัวแปรตัวเดียว ไม่ต้องไปไล่แก้ string ใน query ครับ
ขึ้นกับขนาดข้อมูลครับ ถ้า DataFrame เล็ก (ต่ำกว่าหมื่นแถว) query อาจช้ากว่านิดหน่อยเพราะต้องเสียเวลาแปลง string เป็นโค้ดก่อน แต่พอข้อมูลใหญ่และเงื่อนไขซับซ้อน query กลับเร็วกว่าได้ เพราะเบื้องหลังมันใช้ numexpr ช่วยประมวลผล ส่วนตัวผมเลยไม่กังวลเรื่องความเร็วตอนทำงานข้อมูลก้อนใหญ่ครับ
ได้ครับ แค่ครอบชื่อคอลัมน์ด้วย backtick เช่น df.query('`first name` == "Alice"') แค่นี้ pandas ก็จัดการให้ถูกต้องเอง ไม่ต้องไปเปลี่ยนชื่อคอลัมน์ให้ยุ่งยาก
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas query จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
numpy.where ผมใช้เลือกค่าจาก array ตามเงื่อนไขที่กำหนดครับ ถ้าให้เทียบง่ายๆ มันคือ IF ใน Excel นั่นแหละ แต่เก่งกว่าตรงที่ทำงานกับข้อมูลทั้ง array พร้อมกันในทีเดียว แถมยังใส่อาร์กิวเมนต์เดียวเพื่อหา index ที่ตรงเงื่อนไขได้อีกด้วย
between ใน pandas ผมใช้เช็คว่าค่าในคอลัมน์อยู่ในช่วง [left, right] หรือเปล่า คืนออกมาเป็น Series ของ True/False (เรียกว่า boolean mask) เอาไปกรองแถวต่อได้เลย ถ้าใครเคยเขียนเงื่อนไขใน Excel แบบ ยอด >= 100 AND <= 500 ตัวนี้คือคำสั่งสั้นๆ ที่ทำแบบนั้นให้ในบรรทัดเดียวครับ
dropna ใน pandas ผมใช้สำหรับกำจัดแถวหรือคอลัมน์ที่มีค่า NaN ออกจาก DataFrame ครับ เหมาะมากสำหรับขั้นตอนทำความสะอาดข้อมูลก่อนวิเคราะห์ เพราะค่า NaN แฝงอยู่ในข้อมูลจริงแทบทุกชุด
isna ใน pandas ผมใช้สำหรับเช็คว่าแต่ละช่องใน DataFrame มีค่าว่าง (NaN) อยู่หรือเปล่า คืนผลเป็น True/False ทุกช่อง เหมือน ISBLANK ใน Excel เลยครับ แต่ทำได้กับทั้งตารางพร้อมกันในคำสั่งเดียว
isin ใน pandas ผมใช้เช็คว่าแต่ละค่าในคอลัมน์ตรงกับค่าใน list ที่กำหนดไหม คืนมาเป็น True/False ทีละแถว ถ้าใครเคย filter หลายค่าพร้อมกันใน Excel หรือเขียน OR หลายเงื่อนไขซ้อนๆ กัน ตัวนี้คือทางลัดที่สะอาดกว่ามากครับ
df.loc ใน pandas ผมใช้สำหรับเลือกข้อมูลจาก DataFrame โดยระบุ label ของแถวและคอลัมน์ ไม่ว่าจะเลือกแถวเดียว หลายแถว หรือกรองด้วยเงื่อนไข Boolean เหมือนการกด Ctrl+F ใน Excel แต่ทรงพลังกว่ามากครับ
groupby ใน pandas ผมใช้สำหรับจัดกลุ่มข้อมูลใน DataFrame แล้วคำนวณค่าสรุปในแต่ละกลุ่ม เช่น หาผลรวม ค่าเฉลี่ย หรือค่าสถิติต่างๆ ตามหมวดหมู่ที่กำหนด ถ้าใครเคยใช้ PivotTable ใน Excel มาก่อน บอกเลยว่าตัวนี้คือเครื่องมือสายเดียวกันเลยครับ
head ใน pandas ผมใช้สำหรับดูข้อมูลแถวแรกๆ ของ DataFrame เพื่อเช็กว่าโหลดข้อมูลมาถูกต้องหรือเปล่า คล้ายกับการ scroll ไปดูบนสุดของตาราง Excel เลยครับ
read_csv ใน pandas ผมใช้สำหรับโหลดข้อมูลจากไฟล์ CSV หรือ text ที่มีตัวคั่นเข้ามาเป็น DataFrame พร้อมใช้งาน ถ้าใครเคยเปิดไฟล์ CSV ใน Excel แล้วได้ตารางให้แก้งานต่อ read_csv ก็คือสิ่งเดียวกันเลยครับแต่สำหรับ Python
pandas .str accessor ทำให้ผมใช้ text functions อย่าง upper, replace, contains กับทุกแถวในคอลัมน์พร้อมกันบรรทัดเดียว เหมือนได้ UPPER/SUBSTITUTE/SEARCH ของ Excel แต่ไม่ต้องลากสูตรทีละเซลล์ครับ
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่