---
title: pandas concat — ต่อตารางข้อมูลเข้าหากันแบบกองแถวหรือเพิ่มคอลัมน์
url: https://www.thepexcel.com/functions/python/combine/pandas-concat/
type: function-explainer
program: Python
syntax: "pd.concat(objs, axis, join, ignore_index, keys)"
date: 2026-05-31
scores:
  popularity: 5
  difficulty: 3
  usefulness: 5
---

# pandas concat — ต่อตารางข้อมูลเข้าหากันแบบกองแถวหรือเพิ่มคอลัมน์

> pd.concat ผมใช้สำหรับนำ DataFrame หลายตัวมาเชื่อมต่อกัน จะต่อแนวตั้ง (กองแถว) หรือแนวนอน (เพิ่มคอลัม

## คำอธิบาย

pd.concat ผมใช้สำหรับนำ DataFrame หลายตัวมาเชื่อมต่อกัน จะต่อแนวตั้ง (กองแถว) หรือแนวนอน (เพิ่มคอลัมน์) ก็ได้ ถ้าใครเคยใช้ Power Query ใน Excel แล้ว Append Queries คือตัวเทียบเคียงที่ใกล้เคียงที่สุดครับ

## Syntax

```excel
pd.concat(objs, axis, join, ignore_index, keys)
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| objs | Yes | list \| dict |  | list ของ DataFrame หรือ Series ที่ต้องการเชื่อมต่อ เช่น [df1, df2, df3] หรือ dict {'jan': df_jan, 'feb': df_feb} |
| axis | No | int \| str | 0 | ทิศทางการเชื่อม: 0 หรือ 'index' = กองแถวแนวตั้ง (default), 1 หรือ 'columns' = ต่อคอลัมน์แนวนอน |
| join | No | str | 'outer' | 'outer' = รวม index/column ทั้งหมด เติม NaN ที่ขาด (default). 'inner' = เอาเฉพาะส่วนที่ตรงกัน ตัดส่วนที่ไม่มีทิ้ง |
| ignore_index | No | bool | False | True = รัน index ใหม่ตั้งแต่ 0 ทันที ใช้ตอนกองแถวจากหลายแหล่งที่ index ซ้ำกัน |
| keys | No | sequence | None | ใส่ label ให้แต่ละ DataFrame เพื่อสร้าง MultiIndex ในผลลัพธ์ ช่วยให้รู้ว่าแถวไหนมาจากแหล่งไหน |
| verify_integrity | No | bool | False | True = ตรวจสอบว่า index ซ้ำหลัง concat ไหม ถ้าซ้ำ raise error ใช้ตอน debug ครับ แต่ช้า ไม่แนะนำใช้กับข้อมูลใหญ่ |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: กองแถวสองตารางเข้าด้วยกัน (axis=0)

```excel
pd.concat([df_jan, df_feb])
```

**ผลลัพธ์:** `  month  sales
0   Jan    100
1   Jan    200
0   Feb    150
1   Feb    250`

ผมเอา df_jan กับ df_feb มากองซ้อนกันแนวตั้ง คอลัมน์ตรงกันพอดีก็รวมได้เลยครับ สังเกตว่า index ผลลัพธ์จะเป็น 0,1,0,1 เพราะยังใช้ index เดิมของแต่ละ DataFrame อยู่ ถ้าอยากให้เรียงต่อเนื่องต้องใส่ ignore_index=True

### 2. ตัวอย่างที่ 2: กองแถวและรีเซ็ต index ด้วย ignore_index=True

```excel
pd.concat([df_jan, df_feb], ignore_index=True)
```

**ผลลัพธ์:** `  month  sales
0   Jan    100
1   Jan    200
2   Feb    150
3   Feb    250`

เพิ่ม ignore_index=True เข้าไป pandas จะรัน index ใหม่ตั้งแต่ 0 ถึง 3 ให้อัตโนมัติเลยครับ ผมใช้แทบทุกครั้งตอนรวมไฟล์หลายเดือน เพราะแต่ละไฟล์เริ่ม index ที่ 0 เหมือนกันหมด พอกองแล้ว index ซ้ำกัน ใส่ ignore_index=True ปัญหาหายครับ

### 3. ตัวอย่างที่ 3: ต่อคอลัมน์แนวนอน (axis=1)

```excel
pd.concat([df_score, df_grade], axis=1)
```

**ผลลัพธ์:** `    name  score grade  passed
0  Alice     90     A    True
1    Bob     80     B    True`

เปลี่ยนเป็น axis=1 ผมเอาสองตารางที่มีจำนวนแถวเท่ากันมาวางข้างกัน ได้ DataFrame ที่รวมคอลัมน์จากทั้งสอง เหมือนเพิ่มคอลัมน์ใหม่เข้าไปในตารางเดิมครับ ใช้ตอนคำนวณ feature ไว้ใน DataFrame แยก แล้วอยากนำมารวมกันทีเดียว

### 4. ตัวอย่างที่ 4: ใช้ keys ระบุแหล่งที่มาของแต่ละ DataFrame

```excel
pd.concat([df_jan, df_feb], keys=['Jan', 'Feb'])
```

**ผลลัพธ์:** `       sales
Jan 0    100
    1    200
Feb 0    150
    1    250`

ใส่ keys=['Jan', 'Feb'] เข้าไป ผลลัพธ์จะมี MultiIndex สองระดับ ระดับนอกบอกว่าแถวนี้มาจากเดือนไหน ระดับในคือ index เดิมครับ ผมใช้ตอนอยากเก็บข้อมูลว่าแถวไหนมาจากแหล่งไหน โดยไม่ต้องสร้างคอลัมน์เพิ่ม

## หมายเหตุเพิ่มเติม

- 💡 อย่า concat ในลูป! pattern ที่ช้าคือ df = pd.DataFrame() แล้ว for loop df = pd.concat([df, new_df]) ทุกรอบ ผมเคยทำแล้ว 1,000 ไฟล์ ช้ามาก เพราะ pandas copy DataFrame ใหม่ทุกรอบ แก้ง่ายๆ คือ build list ก่อน all_dfs = [] แล้วค่อย pd.concat(all_dfs) ครั้งเดียวตอนจบ เร็วกว่าเยอะครับ

- ถ้าต้องการรู้ว่าแต่ละแถวมาจากไฟล์ไหน ผมแนะนำให้เพิ่มคอลัมน์ source ก่อน concat เช่น df_jan['source'] = 'Jan' แล้วค่อย concat ทีเดียว ดีกว่าใช้ keys เพราะ MultiIndex ทำงานต่อได้ยุ่งยากกว่าครับ

## คำถามที่พบบ่อย

**Q: concat ต่างจาก merge ยังไง ใช้ตัวไหนดี?**

ผมแยกง่ายๆ แบบนี้ครับ — concat คือ 'ต่อตำแหน่ง' ไม่ดูว่าค่าในแถวตรงกันไหม แค่เอาตารางมาวางต่อกัน (กองแถวหรือต่อคอลัมน์) ส่วน merge คือ 'join ตาม key' เหมือน VLOOKUP ที่ต้องมีคอลัมน์ที่มีค่าตรงกันเพื่อจับคู่แถว ถ้าโจทย์คือ 'เอาข้อมูลหลายไฟล์มารวมกัน' ใช้ concat ถ้าโจทย์คือ 'เอาข้อมูลสองตารางมาจับคู่กันตามรหัสสินค้า' ใช้ merge ครับ

**Q: ถ้าคอลัมน์ไม่ตรงกันจะเกิดอะไร?**

pandas จะเติม NaN ให้ที่ช่องที่ขาดอัตโนมัติเลยครับ (นี่คือพฤติกรรม join='outer' ซึ่งเป็น default) ตัวอย่างเช่น df1 มีคอลัมน์ A,B และ df2 มีคอลัมน์ B,C พอ concat ผลลัพธ์จะมีครบทั้ง A,B,C แถวจาก df1 จะได้ NaN ที่คอลัมน์ C และแถวจาก df2 จะได้ NaN ที่คอลัมน์ A ครับ ถ้าอยากเอาเฉพาะคอลัมน์ที่มีทั้งสองตาราง ใส่ join='inner' ได้เลย

**Q: รวมไฟล์ Excel หลายไฟล์ด้วย concat ยังไง?**

ผมใช้แบบนี้ครับ — ก่อนอื่นโหลดทุกไฟล์ใส่ 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 (official docs)](https://pandas.pydata.org/docs/reference/api/pandas.concat.html) _(article)_

---

_Source: [https://www.thepexcel.com/functions/python/combine/pandas-concat/](https://www.thepexcel.com/functions/python/combine/pandas-concat/)_
