pd.concat ผมใช้สำหรับนำ DataFrame หลายตัวมาเชื่อมต่อกัน จะต่อแนวตั้ง (กองแถว) หรือแนวนอน (เพิ่มคอลัมน์) ก็ได้ ถ้าใครเคยใช้ Power Query ใน Excel แล้ว Append Queries คือตัวเทียบเคียงที่ใกล้เคียงที่สุดครับ
pd.concat(objs, axis, join, ignore_index, keys)
pd.concat(objs, axis, join, ignore_index, keys)
DataFrame
คืนเป็น DataFrame ใหม่เสมอครับ ไม่ได้แก้ไข DataFrame ต้นฉบับ ผลลัพธ์พร้อมใช้ต่อได้เลย ไม่ต้อง chain อะไรเพิ่ม
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| objs | list | dict | Yes | list ของ DataFrame หรือ Series ที่ต้องการเชื่อมต่อ เช่น [df1, df2, df3] หรือ dict {‘jan’: df_jan, ‘feb’: df_feb} | |
| axis | int | str | Optional | 0 | ทิศทางการเชื่อม: 0 หรือ ‘index’ = กองแถวแนวตั้ง (default), 1 หรือ ‘columns’ = ต่อคอลัมน์แนวนอน |
| join | str | Optional | 'outer' | ‘outer’ = รวม index/column ทั้งหมด เติม NaN ที่ขาด (default). ‘inner’ = เอาเฉพาะส่วนที่ตรงกัน ตัดส่วนที่ไม่มีทิ้ง |
| ignore_index | bool | Optional | False | True = รัน index ใหม่ตั้งแต่ 0 ทันที ใช้ตอนกองแถวจากหลายแหล่งที่ index ซ้ำกัน |
| keys | sequence | Optional | None | ใส่ label ให้แต่ละ DataFrame เพื่อสร้าง MultiIndex ในผลลัพธ์ ช่วยให้รู้ว่าแถวไหนมาจากแหล่งไหน |
| verify_integrity | bool | Optional | False | True = ตรวจสอบว่า index ซ้ำหลัง concat ไหม ถ้าซ้ำ raise error ใช้ตอน debug ครับ แต่ช้า ไม่แนะนำใช้กับข้อมูลใหญ่ |
pd.concat([df_jan, df_feb])pd.concat([df_jan, df_feb])
month sales
0 Jan 100
1 Jan 200
0 Feb 150
1 Feb 250
pd.concat([df_jan, df_feb], ignore_index=True)pd.concat([df_jan, df_feb], ignore_index=True)
month sales
0 Jan 100
1 Jan 200
2 Feb 150
3 Feb 250
pd.concat([df_score, df_grade], axis=1)pd.concat([df_score, df_grade], axis=1)
name score grade passed
0 Alice 90 A True
1 Bob 80 B True
pd.concat([df_jan, df_feb], keys=['Jan', 'Feb'])pd.concat([df_jan, df_feb], keys=['Jan', 'Feb'])
sales
Jan 0 100
1 200
Feb 0 150
1 250
ผมแยกง่ายๆ แบบนี้ครับ — 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 ครั้งเดียวตอนจบ
ฟังก์ชันที่ผมใช้บ่อยมากตอนรวมข้อมูลจากหลายไฟล์หรือหลายช่วงเวลาเข้าด้วยกันคือ 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 ก่อนเลยครับ