บทความนี้สาธิตวิธีหาแถวที่เหมือนกัน (Common Rows) ระหว่างสอง DataFrame โดยใช้ฟังก์ชัน concat() ร่วมกับ groupby()
หลักการทำงาน
- รวมสอง DataFrame ด้วย
pd.concat() - รีเซ็ตดัชนีด้วย
reset_index() - จัดกลุ่มตามทุกคอลัมน์ด้วย
groupby() - หากกลุ่มใดมีจำนวนแถวมากกว่า 1 แสดงว่าเป็นแถวที่ซ้ำ (มีในทั้งสอง DataFrame)
โค้ดตัวอย่างสมบูรณ์
import pandas as pd
# DataFrame แรก
dataFrame1 = pd.DataFrame({
"Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
"Reg_Price": [1000, 1500, 1100, 800, 1100, 900]
})
# DataFrame ที่สอง
dataFrame2 = pd.DataFrame({
"Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
"Reg_Price": [1200, 1500, 1000, 800, 1100, 1000]
})
print("DataFrame1:")
print(dataFrame1)
print("\nDataFrame2:")
print(dataFrame2)
# 1. รวมทั้งสอง DataFrame
dfRes = pd.concat([dataFrame1, dataFrame2])
# 2. รีเซ็ตดัชนี
dfRes = dfRes.reset_index(drop=True)
# 3. จัดกลุ่มตามทุกคอลัมน์
dfGroup = dfRes.groupby(list(dfRes.columns))
# 4. หากกลุ่มไหนมีขนาด > 1 = แถวที่ซ้ำ
res = [k[0] for k in dfGroup.groups.values() if len(k) > 1]
# 5. แสดงผลเฉพาะแถวที่ซ้ำ
print("\nแถวที่ซ้ำกัน (Common Rows):")
print(dfRes.reindex(res))
ผลลัพธ์
แถวที่ซ้ำกัน (Common Rows):
Car Reg_Price
3 Tesla 800
1 Lexus 1500
4 Bentley 1100
ข้อสังเกต
- วิธีนี้ตรวจสอบการซ้ำของ "แถวทั้งหมด" (ทุกคอลัมน์ต้องตรงกัน)
- เหมาะสำหรับข้อมูลขนาดเล็กถึงปานกลาง
- สำหรับข้อมูลขนาดใหญ่ ควรพิจารณาใช้
merge()แบบ inner join แทน จะมีประสิทธิภาพดีกว่า
วิธีทางเลือก (แนะนำสำหรับข้อมูลใหญ่)
# ใช้ merge แบบ inner join - เร็วกว่าและอ่านง่ายกว่า
common_rows = pd.merge(dataFrame1, dataFrame2, how='inner')
print(common_rows)