0Pricing
Pandas & NumPy Academy · บทเรียน

pd.concat สำหรับการซ้อน DataFrames

ซ้อน DataFrames ในแนวตั้งหรือแนวนอนด้วย pd.concat จัดแนวตามดัชนีหรือคอลัมน์ และจัดการดัชนีซ้ำ

pd.concat สำหรับการซ้อน DataFrames เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องต่อ DataFrame เข้าด้วยกัน

ในโครงการจริง ข้อมูลมักไม่ได้มาอยู่ในไฟล์เดียว คุณอาจมีไฟล์ยอดขายรายเดือน ไฟล์ส่งออกแบบสำรวจรายภูมิภาค หรือผลลัพธ์จากการสอบถามฐานข้อมูลที่แบ่งออกเป็นหลายคำสั่ง การต่อข้อมูลจะนำ DataFrame ที่แยกกันเหล่านี้มาต่อรวมเป็นตารางเดียว Pandas มี pd.concat() สำหรับงานนี้ โดยรองรับทั้งการต่อแนวตั้ง (ตามแถว) และการต่อแนวนอน (ตามคอลัมน์)

การต่อแนวตั้งพื้นฐาน

การใช้งาน pd.concat() ที่พบบ่อยที่สุดคือการต่อ DataFrame แบบแนวตั้ง (เพิ่มแถว) ให้ส่งรายการของ DataFrame แล้วฟังก์ชันจะนำมาต่อเรียงกันทีละชุด ทั้งสอง DataFrame ควรมีคอลัมน์ที่เข้ากันได้เพื่อให้ได้ผลลัพธ์ที่เรียบร้อย Pandas จะจัดแนวตามชื่อคอลัมน์โดยอัตโนมัติ และเติมคอลัมน์ที่ขาดหายด้วย NaN

import pandas as pd

jan = pd.DataFrame({'product': ['A', 'B'], 'sales': [100, 200]})
feb = pd.DataFrame({'product': ['A', 'C'], 'sales': [150, 120]})

combined = pd.concat([jan, feb])
print(combined)
#   product  sales
# 0       A    100
# 1       B    200
# 0       A    150
# 1       C    120

การรีเซ็ตดัชนีหลังการต่อข้อมูล

โปรดสังเกตว่า pd.concat() จะคงดัชนีเดิมจากแต่ละ DataFrame ไว้ ซึ่งอาจทำให้มีค่าดัชนีซ้ำกัน (ดังที่เห็นด้านบน โดยมีสองแถวที่ดัชนี 0 และสองแถวที่ดัชนี 1) ส่ง ignore_index=True เพื่อสร้างดัชนีจำนวนเต็มใหม่ที่เรียงต่อกันในผลลัพธ์ที่รวมแล้ว ซึ่งเกือบทุกครั้งจะเป็นสิ่งที่คุณต้องการ

combined = pd.concat([jan, feb], ignore_index=True)
print(combined)
#   product  sales
# 0       A    100
# 1       B    200
# 2       A    150
# 3       C    120

print(combined.index)
# RangeIndex(start=0, stop=4, step=1)

ติดตามแหล่งที่มาด้วย keys

เมื่อต่อข้อมูลจากหลายแหล่ง คุณอาจต้องการทราบว่าแต่ละแถวมาจาก DataFrame เดิมใด ให้ส่งพารามิเตอร์ keys พร้อมรายการป้ายกำกับ Pandas จะสร้าง MultiIndex ซึ่งระดับนอกใช้ระบุแหล่งที่มา จากนั้นคุณสามารถใช้ .loc['label'] เพื่อเข้าถึงแถวจากแหล่งที่มาเฉพาะได้

combined = pd.concat([jan, feb], keys=['January', 'February'])
print(combined)
#                product  sales
# January   0         A    100
#           1         B    200
# February  0         A    150
#           1         C    120

# Access only February rows
print(combined.loc['February'])

การต่อแนวนอนด้วย axis=1

ส่ง axis=1 เพื่อต่อ DataFrame แบบเคียงข้างกัน (เพิ่มคอลัมน์) Pandas จะจัดแนวตามดัชนีแถว ดังนั้นทั้งสอง DataFrame ควรมีดัชนีเดียวกันเพื่อให้ได้ผลลัพธ์ที่เรียบร้อย หากดัชนีแตกต่างกัน แถวที่ไม่ตรงกันจะถูกเติมด้วย NaN วิธีนี้มีประโยชน์สำหรับการรวมคุณลักษณะที่คำนวณจากชุดข้อมูลเดียวกันในขั้นตอนที่แยกกัน

names = pd.DataFrame({'name': ['Alice', 'Bob', 'Carol']}, index=[1, 2, 3])
scores = pd.DataFrame({'score': [95, 88, 72]}, index=[1, 2, 3])

combined = pd.concat([names, scores], axis=1)
print(combined)
#     name  score
# 1  Alice     95
# 2    Bob     88
# 3  Carol     72

การจัดการคอลัมน์ที่ไม่ตรงกัน

หาก DataFrame ที่นำมาต่อมีคอลัมน์แตกต่างกัน Pandas จะเก็บคอลัมน์ทั้งหมดไว้และเติมค่าที่หายไปด้วย NaN นี่คือพฤติกรรมเริ่มต้นของ join='outer' หากคุณต้องการเก็บเฉพาะคอลัมน์ที่ปรากฏใน DataFrame ทั้งหมด ให้ส่ง join='inner' ซึ่งจะลบคอลัมน์ที่ไม่ได้มีอยู่ในทุกแหล่งออก

df1 = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
df2 = pd.DataFrame({'b': [5, 6], 'c': [7, 8]})

# Outer join (default): keeps all columns
print(pd.concat([df1, df2], ignore_index=True))
#      a  b    c
# 0  1.0  3  NaN
# 1  2.0  4  NaN
# 2  NaN  5  7.0
# 3  NaN  6  8.0

# Inner join: keeps only shared columns
print(pd.concat([df1, df2], join='inner', ignore_index=True))
#    b
# 0  3
# 1  4
# 2  5
# 3  6

การต่อไฟล์จำนวนมากในลูป

รูปแบบทั่วไปเมื่อโหลดไฟล์หลายไฟล์คือรวบรวม DataFrame ทั้งหมดไว้ในรายการ แล้วเรียก pd.concat() เพียงครั้งเดียวเมื่อจบ หลีกเลี่ยงการต่อข้อมูลภายในลูป (เช่น df = pd.concat([df, new_chunk])) เพราะจะสร้างสำเนา DataFrame ใหม่ในการทำซ้ำทุกครั้ง ส่งผลให้เวลาทำงานมีความซับซ้อนแบบกำลังสองเมื่อมีชุดข้อมูลจำนวนมาก

import glob

# Efficient: collect first, concat once
files = glob.glob('data/sales_*.csv')
frames = [pd.read_csv(f) for f in files]
combined = pd.concat(frames, ignore_index=True)

# Inefficient (avoid):
# result = pd.DataFrame()
# for f in files:
#     result = pd.concat([result, pd.read_csv(f)])  # slow!

การต่อ Series

pd.concat() ใช้ได้กับทั้ง Series และ DataFrame การต่อรายการของ Series ในแนวตั้งจะทำให้ได้ Series ที่ยาวขึ้น การต่อด้วย axis=1 จะสร้าง DataFrame โดยให้แต่ละ Series เป็นคอลัมน์ Series จะถูกจัดแนวตามดัชนี ดังนั้นป้ายกำกับดัชนีต้องตรงกันเพื่อให้การต่อแนวนอนได้ผลลัพธ์ที่เรียบร้อย

s1 = pd.Series([1, 2, 3], name='x')
s2 = pd.Series([4, 5, 6], name='y')

# Vertical: one long Series
print(pd.concat([s1, s2]))
# 0    1
# 1    2
# ...

# Horizontal: a DataFrame with two columns
print(pd.concat([s1, s2], axis=1))
#    x  y
# 0  1  4
# 1  2  5
# 2  3  6

การตรวจสอบผลลัพธ์ที่ต่อแล้ว

หลังจากต่อข้อมูลแล้ว ให้ตรวจสอบเสมอว่าผลลัพธ์มีรูปร่างตามที่คาดไว้และไม่มีค่า NaN ที่ไม่คาดคิด รูปแบบการตรวจสอบเบื้องต้นที่รวดเร็วคือเปรียบเทียบจำนวนแถวรวมกับผลรวมของจำนวนแถวแต่ละชุด และเรียก isna().sum() เพื่อค้นหาค่าที่หายไปโดยไม่ได้ตั้งใจซึ่งเกิดจากการจัดแนวคอลัมน์ไม่ตรงกัน การตรวจสอบเหล่านี้ช่วยป้องกันปัญหาคุณภาพข้อมูลที่เกิดขึ้นโดยไม่แจ้งเตือนไม่ให้ส่งต่อไปยังการวิเคราะห์

combined = pd.concat([jan, feb], ignore_index=True)

# Sanity checks
assert len(combined) == len(jan) + len(feb), 'Row count mismatch'
print('Missing values per column:')
print(combined.isna().sum())
print('Shape:', combined.shape)

concat เทียบกับ append (เลิกใช้แล้ว)

โค้ด Pandas รุ่นเก่าอาจใช้ df.append(other) ซึ่งเป็นตัวช่วยอำนวยความสะดวกที่ทำงานครอบ pd.concat() เมธอดนี้ถูกประกาศเลิกใช้ใน Pandas 1.4 และถูกนำออกใน Pandas 2.0 สำหรับโค้ดสมัยใหม่ ให้ใช้ pd.concat([df, other], ignore_index=True) เสมอ พฤติกรรมเหมือนกัน แต่ pd.concat สื่อความหมายชัดเจนกว่าและรองรับการต่อ DataFrame มากกว่าสองชุดพร้อมกัน

# Old (removed in Pandas 2.0):
# combined = jan.append(feb, ignore_index=True)

# Modern equivalent:
combined = pd.concat([jan, feb], ignore_index=True)
print(combined)

ตัวอย่างเชิงปฏิบัติ: รายงานยอดขายรายปี

ต่อไปนี้คือตัวอย่างรูปแบบการใช้งานจริง: โหลด DataFrame รายเดือน เพิ่มป้ายกำกับแหล่งที่มา ต่อข้อมูลเข้าด้วยกัน และคำนวณสรุปยอดขายตลอดทั้งปี พารามิเตอร์ keys ช่วยให้ติดตามแต่ละแถวกลับไปยังเดือนได้ง่าย และการใช้ ignore_index=True ร่วมกับคอลัมน์เดือนจะทำให้ได้ DataFrame แบบแบนที่สะอาดสำหรับการวิเคราะห์แบบจัดกลุ่ม

months = ['jan', 'feb', 'mar']
frames = []
for m in months:
    df = pd.DataFrame({'product': ['A', 'B'], 'sales': [100, 200]})
    df['month'] = m
    frames.append(df)

yearly = pd.concat(frames, ignore_index=True)
print(yearly.groupby('month')['sales'].sum())

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับ pd.concat สำหรับการต่อ DataFrame จากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้วิธีวาง DataFrame ต่อกันในแนวตั้งด้วย pd.concat() และ ignore_index=True วิธีติดตามแหล่งที่มาด้วย พารามิเตอร์ keys และวิธีที่ join='inner' กับ 'outer' ควบคุมการจัดการคอลัมน์เมื่อโครงสร้างข้อมูลแตกต่างกัน ต่อไปเราจะสำรวจ pd.merge() สำหรับ inner และ outer join ในรูปแบบ SQL บนคอลัมน์คีย์ร่วมกัน

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

บทเรียน “pd.concat สำหรับการซ้อน DataFrames” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “pd.concat สำหรับการซ้อน DataFrames” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “pd.concat สำหรับการซ้อน DataFrames”

ซ้อน DataFrames ในแนวตั้งหรือแนวนอนด้วย pd.concat จัดแนวตามดัชนีหรือคอลัมน์ และจัดการดัชนีซ้ำ คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “pd.concat สำหรับการซ้อน DataFrames” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. pd.concat สำหรับการซ้อน DataFrames
  2. pd.merge: การเชื่อมแบบด้านในและด้านนอก
  3. การเชื่อมด้านซ้ายและด้านขวา
  4. การเชื่อมตามดัชนี
← กลับไปที่ Pandas & NumPy Academy