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

Python Pandas - Merge DataFrame สร้าง Cartesian Product (Cross Join)

Cartesian Product (Cross Join)** คือการรวมแถวทุกคู่ที่เป็นไปได้ระหว่างสอง DataFrame โดยไม่มีเงื่อนไขการจับคู่ (join condition) ใน Pandas ทำได้โดยตั้งค่า how="cross" ใน pd.merge() (รองรับ Pandas 1.2.0+)

ขั้นตอนการทำงาน

1. สร้าง DataFrame ทั้งสอง

import pandas as pd

dataFrame1 = pd.DataFrame({
    "Car": ['BMW', 'Mustang', 'Bentley', 'Jaguar'],
    "Units": [100, 150, 110, 120]
})

dataFrame2 = pd.DataFrame({
    "Car": ['BMW', 'Tesla', 'Jaguar'],
    "Reg_Price": [7000, 8000, 9000]
})

2. Cross Join (Cartesian Product)

mergedRes = pd.merge(dataFrame1, dataFrame2, how="cross")
print(mergedRes)

โค้ดตัวอย่างสมบูรณ์

import pandas as pd

dataFrame1 = pd.DataFrame({
    "Car": ['BMW', 'Mustang', 'Bentley', 'Jaguar'],
    "Units": [100, 150, 110, 120]
})
print("DataFrame1:\n", dataFrame1)

dataFrame2 = pd.DataFrame({
    "Car": ['BMW', 'Tesla', 'Jaguar'],
    "Reg_Price": [7000, 8000, 9000]
})
print("\nDataFrame2:\n", dataFrame2)

# Cartesian Product
mergedRes = pd.merge(dataFrame1, dataFrame2, how="cross")
print("\nMerged dataframe (cartesian product):\n", mergedRes)

ผลลัพธ์

Merged dataframe (cartesian product):
       Car  Units    Car_y  Reg_Price
0      BMW    100      BMW       7000
1      BMW    100     Tesla       8000
2      BMW    100    Jaguar       9000
3   Mustang    150      BMW       7000
4   Mustang    150     Tesla       8000
5   Mustang    150    Jaguar       9000
6   Bentley    110      BMW       7000
7   Bentley    110     Tesla       8000
8   Bentley    110    Jaguar       9000
9    Jaguar    120      BMW       7000
10   Jaguar    120     Tesla       8000
11   Jaguar    120    Jaguar       9000

คำอธิบาย

  • DataFrame1 มี 4 แถว, DataFrame2 มี 3 แถว → ผลลัพธ์ 4 × 3 = 12 แถว
  • คอลัมน์ที่ชื่อซ้ำ (Car) จะถูก rename อัตโนมัติเป็น Car_x และ Car_y (ในที่นี้แสดงเป็น Car และ Car_y)
  • ใช้กรณี: สร้างชุดข้อมูลทดสอบ, คำนวณความน่าจะเป็นร่วม, ทดสอบทุกชุดพารามิเตอร์

⚠️ ข้อควรระวัง

  • ขนาดข้อมูลจะเพิ่มขึ้นแบบคูณ (M × N) → อาจกินหน่วยความจำมากถ้าข้อมูลใหญ่
  • Pandas < 1.2.0 ใช้ workaround: df1.assign(key=1).merge(df2.assign(key=1), on='key').drop('key', axis=1)