Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python Pandas: รวม DataFrame ด้วย concat() และลบแถวซ้ำด้วย drop_duplicates()

บทนำ

การรวม (concatenate) DataFrame หลายตัวอาจทำให้เกิดแถวซ้ำ ใช้ pd.concat() รวม แล้วตามด้วย drop_duplicates() ลบแถวที่ซ้ำกันทั้งแถว

ตัวอย่างโค้ด


import pandas as pd

# DataFrame 1
df1 = pd.DataFrame({
    "Car": ['BMW', 'Jaguar', 'Audi', 'Mustang'],
    "Units": [100, 150, 110, 80]
})

# DataFrame 2
df2 = pd.DataFrame({
    "Car": ['Tesla', 'Jaguar', 'Mercedes', 'Mustang'],
    "Units": [120, 150, 180, 80]
})

print("DataFrame 1:")
print(df1)
print("\nDataFrame 2:")
print(df2)

# รวมและลบซ้ำ
concat_result = pd.concat([df1, df2]).drop_duplicates()

print("\nรวมและลบแถวซ้ำ:")
print(concat_result)

ผลลัพธ์


DataFrame 1:
       Car  Units
0      BMW    100
1   Jaguar    150
2     Audi    110
3  Mustang     80

DataFrame 2:
       Car  Units
0    Tesla    120
1   Jaguar    150
2 Mercedes    180
3  Mustang     80

รวมและลบแถวซ้ำ:
       Car  Units
0      BMW    100
1   Jaguar    150
2     Audi    110
3  Mustang     80
0    Tesla    120
2 Mercedes    180

คำอธิบาย

  • Jaguar 150 และ Mustang 80 ปรากฏในทั้งสอง DataFrame → ถูกลบซ้ำเหลือ 1 แถว
  • drop_duplicates() เปรียบเทียบทุกคอลัมน์ (subset=None default)
  • Index ถูกรีเซ็ตไม่ได้ (ยังคง index เดิม) → ใช้ ignore_index=True ใน concat

พารามิเตอร์สำคัญของ drop_duplicates()

พารามิเตอร์คำอธิบายค่าเริ่มต้น
subsetคอลัมน์ที่ใช้เปรียบเทียบ (list หรือ column name)None (ทุกคอลัมน์)
keep'first'/'last'/False - เก็บอันไหน'first'
inplaceTrue = แก้ไข inplaceFalse
ignore_indexTrue = รีเซ็ต indexFalse

ตัวอย่างการใช้ subset และ keep


# ลบซ้ำเฉพาะคอลัมน์ Car (เก็บแถวสุดท้าย)
df_dedup = pd.concat([df1, df2]).drop_duplicates(subset=['Car'], keep='last')
print(df_dedup)
#       Car  Units
# 2     Audi    110
# 1   Jaguar    150  ← จาก df2 (last)
# 3  Mustang     80  ← จาก df2 (last)
# 0    Tesla    120
# 2 Mercedes    180

ประสิทธิภาพ

  • concat: O(n) สร้าง DataFrame ใหม่
  • drop_duplicates: O(n log n) เนื่องจากต้อง sort/hash
  • สำหรับข้อมูลใหญ่: พิจารณา df.drop_duplicates(subset=key_cols) ก่อน concat

สรุป

ใช้ pd.concat([df1, df2]).drop_duplicates() รวม DataFrame และลบแถวซ้ำทั้งแถว ใช้ subset และ keep ควบคุมการลบซ้ำ เลือก ignore_index=True ใน concat เพื่อ index สวย