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

Python Pandas - Merge DataFrame ด้วยคอลัมน์ร่วม และตั้งค่า NaN สำหรับค่าที่ไม่จับคู่

เมื่อต้องการรวมสอง DataFrame โดยใช้คอลัมน์ร่วม (common column) และต้องการเก็บข้อมูลฝั่งหนึ่งไว้ทั้งหมด ส่วนฝั่งอีกฝั่งที่ไม่มีค่าจับคู่ให้แสดงเป็น NaN ใช้พารามิเตอร์ how="left" (Left Join) หรือ how="right" (Right Join) ใน pd.merge()

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

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

import pandas as pd

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

dataFrame2 = pd.DataFrame({
    "Car": ['BMW', 'Lexus', 'Tesla', 'Mustang', 'Mercedes', 'Jaguar'],
    "Reg_Price": [7000, 1500, 5000, 8000, 9000, 6000]
})

2. Left Join (เก็บ df1 ทั้งหมด, df2 ที่ไม่จับคู่ = NaN)

mergedRes = pd.merge(dataFrame1, dataFrame2, on='Car', how='left')
print(mergedRes)

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

import pandas as pd

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

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

# Left Join
mergedRes = pd.merge(dataFrame1, dataFrame2, on='Car', how='left')
print("\nMerged data frame (left join):\n", mergedRes)

ผลลัพธ์

Merged data frame (left join):
      Car  Units  Reg_Price
0     BMW    100     7000.0
1   Lexus    150     1500.0
2    Audi    110        NaN
3  Mustang     80     8000.0
4  Bentley    110        NaN
5   Jaguar     90     6000.0

คำอธิบายประเภท Join

howชื่อคำอธิบาย
'left'Left Joinเก็บแถวทั้งหมดของ DataFrame ซ้าย (df1), ขวาที่ไม่จับคู่ = NaN
'right'Right Joinเก็บแถวทั้งหมดของ DataFrame ขวา (df2), ซ้ายที่ไม่จับคู่ = NaN
'outer'Full Outer Joinเก็บทุกแถวจากทั้งสองฝั่ง, ไม่จับคู่ = NaN
'inner'Inner Joinเก็บเฉพาะแถวที่จับคู่ได้ทั้งคู่ (default)
'cross'Cross JoinCartesian Product (ไม่ต้องระบุ on)

การจัดการ NaN หลัง Merge

# เติม NaN ด้วยค่าที่ต้องการ
mergedRes['Reg_Price'] = mergedRes['Reg_Price'].fillna(0)

# หรือลบแถวที่มี NaN
mergedRes = mergedRes.dropna(subset=['Reg_Price'])