DataFrame
คืนเป็น DataFrame ใหม่เสมอครับ ไม่ได้แก้ไข DataFrame ต้นฉบับ ผลลัพธ์พร้อมใช้ต่อได้เลย ไม่ต้อง chain อะไรเพิ่ม
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| objs | list | dict | list ของ DataFrame หรือ Series ที่ต้องการเชื่อมต่อ เช่น [df1, df2, df3] หรือ dict {‘jan’: df_jan, ‘feb’: df_feb} | |
| [axis]ไม่บังคับ | int | str | 0 | ทิศทางการเชื่อม: 0 หรือ ‘index’ = กองแถวแนวตั้ง (default), 1 หรือ ‘columns’ = ต่อคอลัมน์แนวนอน |
| [join]ไม่บังคับ | str | 'outer' | ‘outer’ = รวม index/column ทั้งหมด เติม NaN ที่ขาด (default). ‘inner’ = เอาเฉพาะส่วนที่ตรงกัน ตัดส่วนที่ไม่มีทิ้ง |
| [ignore_index]ไม่บังคับ | bool | False | True = รัน index ใหม่ตั้งแต่ 0 ทันที ใช้ตอนกองแถวจากหลายแหล่งที่ index ซ้ำกัน |
| [keys]ไม่บังคับ | sequence | None | ใส่ label ให้แต่ละ DataFrame เพื่อสร้าง MultiIndex ในผลลัพธ์ ช่วยให้รู้ว่าแถวไหนมาจากแหล่งไหน |
| [verify_integrity]ไม่บังคับ | bool | False | True = ตรวจสอบว่า index ซ้ำหลัง concat ไหม ถ้าซ้ำ raise error ใช้ตอน debug ครับ แต่ช้า ไม่แนะนำใช้กับข้อมูลใหญ่ |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
ฟังก์ชันที่ผมใช้บ่อยมากตอนรวมข้อมูลจากหลายไฟล์หรือหลายช่วงเวลาเข้าด้วยกันคือ pd.concat ครับ ลองนึกภาพข้อมูลขายรายเดือน 12 ไฟล์ ผมแค่โหลดทั้งหมดใส่ list แล้วยิง concat ตัวเดียว ได้ตารางรวมทันที ไม่ต้องวน loop ก็อปทีละไฟล์ 😎
การทำงานหลักของ concat มีสองโหมดครับ:
– **axis=0 (default)** — กองแถวแนวตั้ง เหมือนวางตารางซ้อนกัน คอลัมน์ตรงกันก็รวมกัน คอลัมน์ไม่ตรงก็เติม NaN ให้อัตโนมัติ (join=’outer’)
– **axis=1** — ต่อคอลัมน์แนวนอน เหมือนเอาตารางวางข้างกัน ใช้ตอนอยากรวม feature จากหลาย DataFrame ที่มี index ตรงกัน
ที่เจ๋งคือ ignore_index=True ครับ เวลากองแถวจากหลายแหล่ง index อาจซ้ำกัน (ทุกไฟล์เริ่มที่ 0) ใส่ ignore_index=True ปุ๊บ pandas รันเลข index ใหม่ให้ตั้งแต่ 0 ถึง n-1 เรียบร้อย ✨
ส่วนตัวผมสิ่งที่ต้องจำให้ขึ้นใจคือ concat vs merge ต่างกันอย่างนี้ครับ — concat คือการ “ต่อตำแหน่ง” (stack ตาม index/column label) ส่วน merge คือการ “join ตาม key” เหมือน VLOOKUP ที่จับคู่แถวด้วยค่าในคอลัมน์ ถ้าไม่มี key ให้ match ให้นึกถึง concat ก่อนเลยครับ
ผมเอา df_jan กับ df_feb มากองซ้อนกันแนวตั้ง คอลัมน์ตรงกันพอดีก็รวมได้เลยครับ สังเกตว่า index ผลลัพธ์จะเป็น 0,1,0,1 เพราะยังใช้ index เดิมของแต่ละ DataFrame อยู่ ถ้าอยากให้เรียงต่อเนื่องต้องใส่ ignore_index=True
เพิ่ม ignore_index=True เข้าไป pandas จะรัน index ใหม่ตั้งแต่ 0 ถึง 3 ให้อัตโนมัติเลยครับ ผมใช้แทบทุกครั้งตอนรวมไฟล์หลายเดือน เพราะแต่ละไฟล์เริ่ม index ที่ 0 เหมือนกันหมด พอกองแล้ว index ซ้ำกัน ใส่ ignore_index=True ปัญหาหายครับ
เปลี่ยนเป็น axis=1 ผมเอาสองตารางที่มีจำนวนแถวเท่ากันมาวางข้างกัน ได้ DataFrame ที่รวมคอลัมน์จากทั้งสอง เหมือนเพิ่มคอลัมน์ใหม่เข้าไปในตารางเดิมครับ ใช้ตอนคำนวณ feature ไว้ใน DataFrame แยก แล้วอยากนำมารวมกันทีเดียว
ใส่ keys=['Jan', 'Feb'] เข้าไป ผลลัพธ์จะมี MultiIndex สองระดับ ระดับนอกบอกว่าแถวนี้มาจากเดือนไหน ระดับในคือ index เดิมครับ ผมใช้ตอนอยากเก็บข้อมูลว่าแถวไหนมาจากแหล่งไหน โดยไม่ต้องสร้างคอลัมน์เพิ่ม
ผมแยกง่ายๆ แบบนี้ครับ — concat คือ 'ต่อตำแหน่ง' ไม่ดูว่าค่าในแถวตรงกันไหม แค่เอาตารางมาวางต่อกัน (กองแถวหรือต่อคอลัมน์) ส่วน merge คือ 'join ตาม key' เหมือน VLOOKUP ที่ต้องมีคอลัมน์ที่มีค่าตรงกันเพื่อจับคู่แถว ถ้าโจทย์คือ 'เอาข้อมูลหลายไฟล์มารวมกัน' ใช้ concat ถ้าโจทย์คือ 'เอาข้อมูลสองตารางมาจับคู่กันตามรหัสสินค้า' ใช้ merge ครับ
pandas จะเติม NaN ให้ที่ช่องที่ขาดอัตโนมัติเลยครับ (นี่คือพฤติกรรม join='outer' ซึ่งเป็น default) ตัวอย่างเช่น df1 มีคอลัมน์ A,B และ df2 มีคอลัมน์ B,C พอ concat ผลลัพธ์จะมีครบทั้ง A,B,C แถวจาก df1 จะได้ NaN ที่คอลัมน์ C และแถวจาก df2 จะได้ NaN ที่คอลัมน์ A ครับ ถ้าอยากเอาเฉพาะคอลัมน์ที่มีทั้งสองตาราง ใส่ join='inner' ได้เลย
ผมใช้แบบนี้ครับ — ก่อนอื่นโหลดทุกไฟล์ใส่ list comprehension แล้วค่อยยิง concat ครั้งเดียว เช่น files = ['jan.xlsx','feb.xlsx','mar.xlsx'] แล้ว pd.concat([pd.read_excel(f) for f in files], ignore_index=True) บรรทัดเดียวได้ข้อมูลรวมทั้งสามเดือนเลย สิ่งสำคัญคือ อย่าสร้าง DataFrame เปล่าแล้ว concat ทีละไฟล์ใน loop นะครับ มันช้ามาก ควร build list ก่อนแล้ว concat ครั้งเดียวตอนจบ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas concat จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
np.concatenate ใช้ต่อ array หลายชุดเข้าด้วยกันตามแกนที่กำหนด คล้ายกับที่ pd.concat ทำกับ DataFrame แต่เป็น NumPy version ที่เร็วกว่าและเหมาะกับข้อมูลตัวเลขล้วนๆ ครับ
merge ใน pandas คือวิธีที่ผมใช้รวมสองตารางเข้าด้วยกันโดยจับคู่ตามคอลัมน์ที่กำหนด เหมือน VLOOKUP ใน Excel แต่ทรงพลังกว่ามากเพราะดึงได้ทุกคอลัมน์และรองรับ join หลายรูปแบบในคำสั่งเดียวครับ
groupby ใน pandas ผมใช้สำหรับจัดกลุ่มข้อมูลใน DataFrame แล้วคำนวณค่าสรุปในแต่ละกลุ่ม เช่น หาผลรวม ค่าเฉลี่ย หรือค่าสถิติต่างๆ ตามหมวดหมู่ที่กำหนด ถ้าใครเคยใช้ PivotTable ใน Excel มาก่อน บอกเลยว่าตัวนี้คือเครื่องมือสายเดียวกันเลยครับ
pd.melt ผมใช้แปลงตารางจากแนวกว้าง (wide) ให้เป็นแนวยาว (long) คือยุบหลายๆ คอลัมน์ให้มารวมกันเป็นคอลัมน์เดียว ถ้าใครเคยใช้ Power Query มาก่อน บอกเลยว่านี่คือคำสั่ง Unpivot นั่นแหละครับ แค่ย้ายมาเขียนใน pandas
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่