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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- pd.concat สำหรับการซ้อน DataFrames
- pd.merge: การเชื่อมแบบด้านในและด้านนอก
- การเชื่อมด้านซ้ายและด้านขวา
- การเชื่อมตามดัชนี