คู่มือฉบับสมบูรณ์เกี่ยวกับการรวมและเชื่อม DataFrame ใน Python Pandas ครอบคลุมกลยุทธ์ต่างๆ เช่น inner, outer, left, และ right join พร้อมตัวอย่างจริงสำหรับการวิเคราะห์ข้อมูลระดับโลก
Python Pandas Merging: Mastering DataFrame Joining Strategies for Data Analysis
การจัดการข้อมูลเป็นส่วนสำคัญของการวิเคราะห์ข้อมูล และไลบรารี Pandas ใน Python ก็มีเครื่องมืออันทรงพลังสำหรับวัตถุประสงค์นี้ ในบรรดาเครื่องมือเหล่านี้ การรวม (merging) และการเชื่อม (joining) DataFrame เป็นการดำเนินการที่จำเป็นสำหรับการรวมชุดข้อมูลโดยใช้คอลัมน์หรือดัชนีร่วมกัน คู่มือฉบับสมบูรณ์นี้จะสำรวจกลยุทธ์การเชื่อม DataFrame ต่างๆ ใน Pandas เพื่อให้คุณมีความรู้ในการรวมและวิเคราะห์ข้อมูลจากแหล่งต่างๆ ได้อย่างมีประสิทธิภาพ
ทำความเข้าใจการรวมและการเชื่อม DataFrame
การรวมและการเชื่อม DataFrame เกี่ยวข้องกับการรวม DataFrame สองชุดขึ้นไปให้เป็น DataFrame เดียวโดยอิงจากคอลัมน์หรือดัชนีร่วมกัน ความแตกต่างหลักระหว่าง `merge` และ `join` คือ `merge` เป็นฟังก์ชันของไลบรารี Pandas และโดยทั่วไปจะเชื่อม DataFrame บนคอลัมน์ ในขณะที่ `join` เป็นเมธอดของ DataFrame ที่เชื่อม DataFrame โดยหลักบนดัชนี แม้ว่าจะสามารถใช้กับคอลัมน์ได้เช่นกัน
แนวคิดหลัก
- DataFrames: โครงสร้างข้อมูลสองมิติที่มีป้ายกำกับพร้อมคอลัมน์ที่อาจมีประเภทแตกต่างกัน
- คอลัมน์/ดัชนีร่วม: คอลัมน์หรือดัชนีที่มีชื่อและประเภทข้อมูลเดียวกันใน DataFrame ต่างๆ ซึ่งทำหน้าที่เป็นพื้นฐานสำหรับการรวม/เชื่อม
- ประเภทการ Join: กลยุทธ์ต่างๆ ในการจัดการกับแถวที่ไม่ตรงกันในระหว่างกระบวนการรวม/เชื่อม ซึ่งรวมถึง inner, outer, left, และ right join
การรวม DataFrame ด้วย `pd.merge()`
ฟังก์ชัน `pd.merge()` เป็นเครื่องมือหลักสำหรับการรวม DataFrame โดยอิงจากคอลัมน์ ซึ่งมีวิธีที่ยืดหยุ่นในการรวมข้อมูลโดยอิงจากคอลัมน์ร่วมกันหนึ่งคอลัมน์หรือมากกว่า
รูปแบบการใช้งาน
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
พารามิเตอร์
- left: DataFrame ด้านซ้ายที่จะรวม
- right: DataFrame ด้านขวาที่จะรวม
- how: ประเภทของการรวมที่จะดำเนินการ ('inner', 'outer', 'left', 'right') ค่าเริ่มต้นคือ 'inner'
- on: ชื่อของคอลัมน์ที่จะใช้ join คอลัมน์เหล่านี้ต้องมีอยู่ใน DataFrame ทั้งสอง
- left_on: ชื่อของคอลัมน์ใน DataFrame ด้านซ้ายที่จะใช้เป็นคีย์ในการ join
- right_on: ชื่อของคอลัมน์ใน DataFrame ด้านขวาที่จะใช้เป็นคีย์ในการ join
- left_index: หากเป็น True จะใช้ดัชนีจาก DataFrame ด้านซ้ายเป็นคีย์ในการ join
- right_index: หากเป็น True จะใช้ดัชนีจาก DataFrame ด้านขวาเป็นคีย์ในการ join
- sort: เรียงลำดับ DataFrame ผลลัพธ์ตามคีย์ที่ใช้ join ตามพจนานุกรม ค่าเริ่มต้นคือ False
- suffixes: ทูเพิลของสตริงส่วนต่อท้ายที่จะนำไปใช้กับชื่อคอลัมน์ที่ซ้ำกัน ค่าเริ่มต้นคือ ('_x', '_y')
- copy: หากเป็น False จะหลีกเลี่ยงการคัดลอกข้อมูลไปยัง DataFrame ใหม่ในกรณีที่เป็นไปได้ ค่าเริ่มต้นคือ True
- indicator: หากเป็น True จะเพิ่มคอลัมน์ชื่อ '_merge' ซึ่งระบุที่มาของแต่ละแถว
- validate: ตรวจสอบว่าการรวมเป็นประเภทที่ระบุหรือไม่ "one_to_one", "one_to_many", "many_to_one", "many_to_many"
คำอธิบายประเภทการ Join
พารามิเตอร์ `how` ใน `pd.merge()` จะเป็นตัวกำหนดประเภทของการ join ที่ดำเนินการ ประเภทการ join ที่แตกต่างกันจะจัดการกับแถวที่ไม่ตรงกันในรูปแบบที่ต่างกัน
Inner Join
Inner join จะคืนค่าเฉพาะแถวที่มีค่าตรงกันใน DataFrame ทั้งสองโดยอิงจากคีย์ที่ใช้ join แถวที่มีค่าไม่ตรงกันจะถูกตัดออกจากผลลัพธ์
ตัวอย่าง:
import pandas as pd
# DataFrame 1: Customer Orders
df_orders = pd.DataFrame({
'order_id': [1, 2, 3, 4, 5],
'customer_id': [101, 102, 103, 104, 105],
'product_id': [1, 2, 1, 3, 2],
'quantity': [2, 1, 3, 1, 2]
})
# DataFrame 2: Customer Information
df_customers = pd.DataFrame({
'customer_id': [101, 102, 103, 106],
'customer_name': ['Alice', 'Bob', 'Charlie', 'David'],
'country': ['USA', 'Canada', 'UK', 'Australia']
})
# Inner Join
df_inner = pd.merge(df_orders, df_customers, on='customer_id', how='inner')
print(df_inner)
ผลลัพธ์:
order_id customer_id product_id quantity customer_name country
0 1 101 1 2 Alice USA
1 2 102 2 1 Bob Canada
2 3 103 1 3 Charlie UK
ในตัวอย่างนี้ inner join จะรวม DataFrame `df_orders` และ `df_customers` โดยอิงจากคอลัมน์ `customer_id` เฉพาะลูกค้าที่ได้ทำการสั่งซื้อเท่านั้นที่จะถูกรวมอยู่ในผลลัพธ์ ลูกค้า 'David' (customer_id 106) จะถูกตัดออกไปเพราะเขาไม่มีคำสั่งซื้อใดๆ
Outer Join (Full Outer Join)
Outer join จะคืนค่าทุกแถวจาก DataFrame ทั้งสอง รวมถึงแถวที่ไม่ตรงกันด้วย หากแถวใดไม่มีคู่ที่ตรงกันในอีก DataFrame หนึ่ง คอลัมน์ที่เกี่ยวข้องจะบรรจุค่า `NaN` (Not a Number)
ตัวอย่าง:
# Outer Join
df_outer = pd.merge(df_orders, df_customers, on='customer_id', how='outer')
print(df_outer)
ผลลัพธ์:
order_id customer_id product_id quantity customer_name country
0 1.0 101 1.0 2.0 Alice USA
1 2.0 102 2.0 1.0 Bob Canada
2 3.0 103 1.0 3.0 Charlie UK
3 4.0 104 3.0 1.0 NaN NaN
4 5.0 105 2.0 2.0 NaN NaN
5 NaN 106 NaN NaN David Australia
Outer join จะรวมลูกค้าทั้งหมดและคำสั่งซื้อทั้งหมด ลูกค้า 104 และ 105 มีคำสั่งซื้อแต่ไม่มีข้อมูลลูกค้า และลูกค้า 106 มีข้อมูลลูกค้าแต่ไม่มีคำสั่งซื้อ ค่าที่หายไปจะแสดงเป็น `NaN`
Left Join
Left join จะคืนค่าทุกแถวจาก DataFrame ด้านซ้ายและแถวที่ตรงกันจาก DataFrame ด้านขวา หากแถวใน DataFrame ด้านซ้ายไม่มีคู่ที่ตรงกันใน DataFrame ด้านขวา คอลัมน์ที่เกี่ยวข้องจาก DataFrame ด้านขวาจะบรรจุค่า `NaN`
ตัวอย่าง:
# Left Join
df_left = pd.merge(df_orders, df_customers, on='customer_id', how='left')
print(df_left)
ผลลัพธ์:
order_id customer_id product_id quantity customer_name country
0 1 101 1 2 Alice USA
1 2 102 2 1 Bob Canada
2 3 103 1 3 Charlie UK
3 4 104 3 1 NaN NaN
4 5 105 2 2 NaN NaN
Left join จะรวมคำสั่งซื้อทั้งหมดจาก `df_orders` ลูกค้า 104 และ 105 มีคำสั่งซื้อแต่ไม่มีข้อมูลลูกค้า ดังนั้นคอลัมน์ `customer_name` และ `country` จึงเป็น `NaN` สำหรับคำสั่งซื้อเหล่านั้น
Right Join
Right join จะคืนค่าทุกแถวจาก DataFrame ด้านขวาและแถวที่ตรงกันจาก DataFrame ด้านซ้าย หากแถวใน DataFrame ด้านขวามีไม่มีคู่ที่ตรงกันใน DataFrame ด้านซ้าย คอลัมน์ที่เกี่ยวข้องจาก DataFrame ด้านซ้ายจะบรรจุค่า `NaN`
ตัวอย่าง:
# Right Join
df_right = pd.merge(df_orders, df_customers, on='customer_id', how='right')
print(df_right)
ผลลัพธ์:
order_id customer_id product_id quantity customer_name country
0 1.0 101 1.0 2.0 Alice USA
1 2.0 102 2.0 1.0 Bob Canada
2 3.0 103 1.0 3.0 Charlie UK
3 NaN 106 NaN NaN David Australia
Right join จะรวมลูกค้าทั้งหมดจาก `df_customers` ลูกค้า 106 มีข้อมูลลูกค้าแต่ไม่มีคำสั่งซื้อ ดังนั้นคอลัมน์ `order_id`, `product_id`, และ `quantity` จึงเป็น `NaN` สำหรับลูกค้ารายนั้น
การเชื่อม DataFrame ด้วย `df.join()`
เมธอด `df.join()` ใช้เป็นหลักในการเชื่อม DataFrame โดยอิงจากดัชนีของมัน นอกจากนี้ยังสามารถใช้เพื่อเชื่อมบนคอลัมน์ได้ แต่โดยทั่วไปแล้วการใช้ `pd.merge()` สำหรับการเชื่อมโดยใช้คอลัมน์จะสะดวกกว่า
รูปแบบการใช้งาน
DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
พารามิเตอร์
- other: DataFrame อื่นที่จะนำมาเชื่อม
- on: ชื่อคอลัมน์ที่จะใช้เชื่อม ต้องระบุหากไม่ได้ใช้ดัชนีเป็นคีย์ในการเชื่อม
- how: วิธีการจัดการการดำเนินการของชุดข้อมูลด้านซ้ายและขวา ค่าเริ่มต้นคือ 'left'
- lsuffix: ส่วนต่อท้ายที่จะใช้จาก DataFrame ด้านซ้ายเพื่อแทนที่ชื่อคอลัมน์ที่ซ้ำกัน
- rsuffix: ส่วนต่อท้ายที่จะใช้จาก DataFrame ด้านขวาเพื่อแทนที่ชื่อคอลัมน์ที่ซ้ำกัน
- sort: เรียงลำดับ DataFrame ผลลัพธ์ตามคีย์ที่ใช้ join ตามพจนานุกรม ค่าเริ่มต้นคือ False
การเชื่อมบนดัชนี
เมื่อเชื่อมบนดัชนี จะไม่มีการใช้พารามิเตอร์ `on`
ตัวอย่าง:
# DataFrame 1: Customer Orders with Customer ID as Index
df_orders_index = df_orders.set_index('customer_id')
# DataFrame 2: Customer Information with Customer ID as Index
df_customers_index = df_customers.set_index('customer_id')
# Join on Index (Left Join)
df_join_index = df_orders_index.join(df_customers_index, how='left')
print(df_join_index)
ผลลัพธ์:
order_id product_id quantity customer_name country
customer_id
101 1 1 2 Alice USA
102 2 2 1 Bob Canada
103 3 1 3 Charlie UK
104 4 3 1 NaN NaN
105 5 2 2 NaN NaN
ในตัวอย่างนี้ เมธอด `join()` ถูกใช้เพื่อดำเนินการ left join บนดัชนี (`customer_id`) ผลลัพธ์จะคล้ายกับการใช้ left join ด้วย `pd.merge()` แต่การเชื่อมจะอิงจากดัชนีแทนที่จะเป็นคอลัมน์
การเชื่อมบนคอลัมน์
ในการเชื่อมบนคอลัมน์โดยใช้ `df.join()` คุณต้องระบุพารามิเตอร์ `on`
ตัวอย่าง:
# Joining on a column
df_join_column = df_orders.join(df_customers.set_index('customer_id'), on='customer_id', how='left')
print(df_join_column)
ผลลัพธ์:
order_id customer_id product_id quantity customer_name country
0 1 101 1 2 Alice USA
1 2 102 2 1 Bob Canada
2 3 103 1 3 Charlie UK
3 4 104 3 1 NaN NaN
4 5 105 2 2 NaN NaN
ตัวอย่างนี้แสดงการเชื่อม `df_orders` กับ `df_customers` โดยใช้คอลัมน์ `customer_id` โปรดทราบว่า `customer_id` ถูกตั้งเป็นดัชนีใน `df_customers` ก่อนที่จะทำการเชื่อม
การจัดการคอลัมน์ที่ซ้ำซ้อน
เมื่อทำการรวมหรือเชื่อม DataFrame เป็นเรื่องปกติที่จะเจอชื่อคอลัมน์ที่ซ้ำกัน (คอลัมน์ที่มีชื่อเดียวกันใน DataFrame ทั้งสอง) Pandas มีพารามิเตอร์ `suffixes` ใน `pd.merge()` และพารามิเตอร์ `lsuffix` และ `rsuffix` ใน `df.join()` เพื่อจัดการกับสถานการณ์เหล่านี้
การใช้ `suffixes` ใน `pd.merge()`
พารามิเตอร์ `suffixes` ช่วยให้คุณสามารถระบุส่วนต่อท้ายที่จะถูกเพิ่มเข้าไปในชื่อคอลัมน์ที่ซ้ำกันเพื่อแยกความแตกต่าง
ตัวอย่าง:
# DataFrame 1: Product Information
df_products1 = pd.DataFrame({
'product_id': [1, 2, 3],
'product_name': ['Product A', 'Product B', 'Product C'],
'price': [10, 20, 15]
})
# DataFrame 2: Product Information (with potentially updated prices)
df_products2 = pd.DataFrame({
'product_id': [1, 2, 4],
'product_name': ['Product A', 'Product B', 'Product D'],
'price': [12, 18, 25]
})
# Merge with suffixes
df_merged_suffixes = pd.merge(df_products1, df_products2, on='product_id', suffixes=('_old', '_new'))
print(df_merged_suffixes)
ผลลัพธ์:
product_id product_name_old price_old product_name_new price_new
0 1 Product A 10 Product A 12
1 2 Product B 20 Product B 18
ในตัวอย่างนี้ คอลัมน์ `product_name` และ `price` มีอยู่ใน DataFrame ทั้งสอง พารามิเตอร์ `suffixes` จะเพิ่มส่วนต่อท้าย `_old` และ `_new` เพื่อแยกความแตกต่างของคอลัมน์จาก DataFrame ด้านซ้ายและด้านขวาตามลำดับ
การใช้ `lsuffix` และ `rsuffix` ใน `df.join()`
พารามิเตอร์ `lsuffix` และ `rsuffix` ให้ฟังก์ชันการทำงานที่คล้ายกันสำหรับ `df.join()` `lsuffix` จะต่อท้ายคอลัมน์ที่ซ้ำกันของ DataFrame ด้านซ้าย และ `rsuffix` จะต่อท้ายคอลัมน์ของ DataFrame ด้านขวา
ตัวอย่าง:
# Join with lsuffix and rsuffix
df_products1_index = df_products1.set_index('product_id')
df_products2_index = df_products2.set_index('product_id')
df_joined_suffixes = df_products1_index.join(df_products2_index, lsuffix='_old', rsuffix='_new', how='outer')
print(df_joined_suffixes)
ผลลัพธ์:
product_name_old price_old product_name_new price_new
product_id
1 Product A 10.0 Product A 12.0
2 Product B 20.0 Product B 18.0
3 Product C 15.0 NaN NaN
4 NaN NaN Product D 25.0
ตัวอย่างการใช้งานจริงและกรณีศึกษา
การรวมและการเชื่อม DataFrame ถูกใช้อย่างแพร่หลายในสถานการณ์การวิเคราะห์ข้อมูลต่างๆ นี่คือตัวอย่างการใช้งานจริงบางส่วน:
การรวมข้อมูลการขายกับข้อมูลผลิตภัณฑ์
กรณีการใช้งานทั่วไปคือการรวมข้อมูลการขายกับข้อมูลผลิตภัณฑ์ สมมติว่าคุณมี DataFrame ที่มีธุรกรรมการขายและอีก DataFrame หนึ่งที่มีรายละเอียดผลิตภัณฑ์ คุณสามารถรวม DataFrame เหล่านี้เพื่อเพิ่มข้อมูลผลิตภัณฑ์เข้าไปในข้อมูลการขายได้
ตัวอย่าง:
# Sales Transactions Data
df_sales = pd.DataFrame({
'transaction_id': [1, 2, 3, 4, 5],
'product_id': [101, 102, 103, 101, 104],
'quantity': [2, 1, 3, 1, 2],
'sales_date': ['2023-01-15', '2023-02-20', '2023-03-10', '2023-04-05', '2023-05-01']
})
# Product Information Data
df_products = pd.DataFrame({
'product_id': [101, 102, 103, 104],
'product_name': ['Laptop', 'Mouse', 'Keyboard', 'Monitor'],
'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics'],
'price': [1200, 25, 75, 300]
})
# Merge Sales Data with Product Information
df_sales_enriched = pd.merge(df_sales, df_products, on='product_id', how='left')
print(df_sales_enriched)
ผลลัพธ์:
transaction_id product_id quantity sales_date product_name category price
0 1 101 2 2023-01-15 Laptop Electronics 1200
1 2 102 1 2023-02-20 Mouse Electronics 25
2 3 103 3 2023-03-10 Keyboard Electronics 75
3 4 101 1 2023-04-05 Laptop Electronics 1200
4 5 104 2 2023-05-01 Monitor Electronics 300
DataFrame ผลลัพธ์ `df_sales_enriched` ประกอบด้วยธุรกรรมการขายพร้อมกับข้อมูลผลิตภัณฑ์ที่เกี่ยวข้อง ช่วยให้สามารถวิเคราะห์แนวโน้มการขายและประสิทธิภาพของผลิตภัณฑ์ได้อย่างละเอียดมากขึ้น
การรวมข้อมูลลูกค้ากับข้อมูลประชากรศาสตร์
อีกหนึ่งกรณีการใช้งานทั่วไปคือการรวมข้อมูลลูกค้ากับข้อมูลประชากรศาสตร์ ซึ่งช่วยให้สามารถวิเคราะห์พฤติกรรมของลูกค้าโดยอิงจากปัจจัยทางประชากรศาสตร์ได้
ตัวอย่าง:
# Customer Data
df_customers = pd.DataFrame({
'customer_id': [1, 2, 3, 4, 5],
'customer_name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'city': ['New York', 'London', 'Tokyo', 'Sydney', 'Berlin']
})
# Demographic Information Data
df_demographics = pd.DataFrame({
'city': ['New York', 'London', 'Tokyo', 'Sydney', 'Berlin'],
'population': [8419000, 8982000, 13960000, 5312000, 3769000],
'average_income': [75000, 65000, 85000, 90000, 55000]
})
# Merge Customer Data with Demographic Information
df_customer_demographics = pd.merge(df_customers, df_demographics, on='city', how='left')
print(df_customer_demographics)
ผลลัพธ์:
customer_id customer_name city population average_income
0 1 Alice New York 8419000 75000
1 2 Bob London 8982000 65000
2 3 Charlie Tokyo 13960000 85000
3 4 David Sydney 5312000 90000
4 5 Eve Berlin 3769000 55000
DataFrame ผลลัพธ์ `df_customer_demographics` ประกอบด้วยข้อมูลลูกค้าพร้อมกับข้อมูลประชากรศาสตร์สำหรับเมืองของตน ซึ่งช่วยให้สามารถวิเคราะห์พฤติกรรมของลูกค้าโดยอิงจากข้อมูลประชากรของเมืองได้
การวิเคราะห์ข้อมูลห่วงโซ่อุปทานระดับโลก
การรวมข้อมูลใน Pandas มีประโยชน์อย่างมากสำหรับการวิเคราะห์ข้อมูลห่วงโซ่อุปทานระดับโลก ซึ่งข้อมูลมักจะกระจายอยู่ตามตารางต่างๆ ตัวอย่างเช่น การเชื่อมโยงข้อมูลซัพพลายเออร์ ข้อมูลการจัดส่ง และตัวเลขยอดขาย สามารถช่วยเปิดเผยปัญหาคอขวดและเพิ่มประสิทธิภาพด้านโลจิสติกส์ได้
ตัวอย่าง:
# Supplier Data
df_suppliers = pd.DataFrame({
'supplier_id': [1, 2, 3],
'supplier_name': ['GlobalTech', 'EuroParts', 'AsiaSource'],
'location': ['Taiwan', 'Germany', 'China']
})
# Shipping Data
df_shipments = pd.DataFrame({
'shipment_id': [101, 102, 103, 104],
'supplier_id': [1, 2, 3, 1],
'destination': ['USA', 'Canada', 'Australia', 'Japan'],
'shipment_date': ['2023-01-10', '2023-02-15', '2023-03-20', '2023-04-25']
})
# Merge Supplier and Shipment Data
df_supply_chain = pd.merge(df_shipments, df_suppliers, on='supplier_id', how='left')
print(df_supply_chain)
ผลลัพธ์:
shipment_id supplier_id destination shipment_date supplier_name location
0 101 1 USA 2023-01-10 GlobalTech Taiwan
1 102 2 Canada 2023-02-15 EuroParts Germany
2 103 3 Australia 2023-03-20 AsiaSource China
3 104 1 Japan 2023-04-25 GlobalTech Taiwan
เทคนิคการรวมขั้นสูง
การรวมโดยใช้หลายคอลัมน์
คุณสามารถรวม DataFrame โดยอิงจากหลายคอลัมน์ได้โดยการส่งลิสต์ของชื่อคอลัมน์ไปยังพารามิเตอร์ `on`
ตัวอย่าง:
# DataFrame 1
df1 = pd.DataFrame({
'product_id': [1, 1, 2, 2],
'color': ['red', 'blue', 'red', 'blue'],
'quantity': [10, 15, 20, 25]
})
# DataFrame 2
df2 = pd.DataFrame({
'product_id': [1, 1, 2, 2],
'color': ['red', 'blue', 'red', 'blue'],
'price': [5, 7, 8, 10]
})
# Merge on multiple columns
df_merged_multiple = pd.merge(df1, df2, on=['product_id', 'color'], how='inner')
print(df_merged_multiple)
ผลลัพธ์:
product_id color quantity price
0 1 red 10 5
1 1 blue 15 7
2 2 red 20 8
3 2 blue 25 10
การรวมด้วยชื่อคอลัมน์ที่แตกต่างกัน
หากคอลัมน์ที่ใช้ join มีชื่อแตกต่างกันใน DataFrame ทั้งสอง คุณสามารถใช้พารามิเตอร์ `left_on` และ `right_on` เพื่อระบุชื่อคอลัมน์ที่จะใช้ในการรวมได้
ตัวอย่าง:
# DataFrame 1
df1 = pd.DataFrame({
'product_id': [1, 2, 3],
'product_name': ['Product A', 'Product B', 'Product C']
})
# DataFrame 2
df2 = pd.DataFrame({
'id': [1, 2, 4],
'price': [10, 20, 25]
})
# Merge with different column names
df_merged_different = pd.merge(df1, df2, left_on='product_id', right_on='id', how='left')
print(df_merged_different)
ผลลัพธ์:
product_id product_name id price
0 1 Product A 1.0 10.0
1 2 Product B 2.0 20.0
2 3 Product C NaN NaN
การใช้ `indicator` สำหรับการวิเคราะห์การรวม
พารามิเตอร์ `indicator` ใน `pd.merge()` จะเพิ่มคอลัมน์ชื่อ `_merge` ไปยัง DataFrame ผลลัพธ์ ซึ่งระบุที่มาของแต่ละแถว สิ่งนี้มีประโยชน์สำหรับการทำความเข้าใจว่าแถวใดถูกจับคู่และแถวใดไม่ถูกจับคู่
ตัวอย่าง:
# Merge with indicator
df_merged_indicator = pd.merge(df_orders, df_customers, on='customer_id', how='outer', indicator=True)
print(df_merged_indicator)
ผลลัพธ์:
order_id customer_id product_id quantity customer_name country _merge
0 1.0 101 1.0 2.0 Alice USA both
1 2.0 102 2.0 1.0 Bob Canada both
2 3.0 103 1.0 3.0 Charlie UK both
3 4.0 104 3.0 1.0 NaN NaN left_only
4 5.0 105 2.0 2.0 NaN NaN left_only
5 NaN 106 NaN NaN David Australia right_only
คอลัมน์ `_merge` จะระบุว่าแถวนั้นมาจาก DataFrame ทั้งสอง (`both`), มาจาก DataFrame ด้านซ้ายเท่านั้น (`left_only`), หรือมาจาก DataFrame ด้านขวาเท่านั้น (`right_only`)
การตรวจสอบประเภทการรวม
พารามิเตอร์ `validate` ช่วยให้แน่ใจว่าการดำเนินการรวมสอดคล้องกับประเภทความสัมพันธ์ที่คาดหวังระหว่าง DataFrame (เช่น 'one_to_one', 'one_to_many') สิ่งนี้ช่วยป้องกันความไม่สอดคล้องของข้อมูลและข้อผิดพลาด
ตัวอย่าง:
# Example with one-to-one validation
df_users = pd.DataFrame({
'user_id': [1, 2, 3],
'username': ['john_doe', 'jane_smith', 'peter_jones']
})
df_profiles = pd.DataFrame({
'user_id': [1, 2, 3],
'profile_description': ['Software Engineer', 'Data Scientist', 'Project Manager']
})
# Performing a one-to-one merge with validation
merged_df = pd.merge(df_users, df_profiles, on='user_id', validate='one_to_one')
print(merged_df)
หากการรวมข้อมูลละเมิดการตรวจสอบที่ระบุไว้ (เช่น ความสัมพันธ์แบบ many-to-one เมื่อระบุเป็น 'one_to_one') จะเกิด `MergeError` ขึ้น ซึ่งจะแจ้งเตือนคุณถึงปัญหาความสมบูรณ์ของข้อมูลที่อาจเกิดขึ้น
ข้อควรพิจารณาด้านประสิทธิภาพ
การรวมและการเชื่อม DataFrame อาจใช้ทรัพยากรในการคำนวณสูง โดยเฉพาะสำหรับชุดข้อมูลขนาดใหญ่ นี่คือเคล็ดลับบางประการเพื่อปรับปรุงประสิทธิภาพ:
- ใช้ประเภทการ join ที่เหมาะสม: การเลือกประเภทการ join ที่ถูกต้องสามารถส่งผลกระทบอย่างมีนัยสำคัญต่อประสิทธิภาพ ตัวอย่างเช่น หากคุณต้องการเฉพาะแถวที่ตรงกัน ให้ใช้ inner join
- สร้างดัชนีให้กับคอลัมน์ที่ใช้ join: การสร้างดัชนีให้กับคอลัมน์ที่ใช้ join สามารถเร่งกระบวนการรวมข้อมูลได้
- ใช้ประเภทข้อมูลที่เหมาะสม: ตรวจสอบให้แน่ใจว่าคอลัมน์ที่ใช้ join มีประเภทข้อมูลที่เข้ากันได้
- หลีกเลี่ยงการคัดลอกที่ไม่จำเป็น: ตั้งค่า `copy=False` ใน `pd.merge()` และ `df.join()` เพื่อหลีกเลี่ยงการสร้างสำเนาข้อมูลที่ไม่จำเป็น
สรุป
การรวมและการเชื่อม DataFrame เป็นการดำเนินการพื้นฐานในการวิเคราะห์ข้อมูล โดยการทำความเข้าใจประเภทและเทคนิคการ join ที่แตกต่างกัน คุณสามารถรวมและวิเคราะห์ข้อมูลจากแหล่งต่างๆ ได้อย่างมีประสิทธิภาพ ปลดล็อกข้อมูลเชิงลึกที่มีค่า และขับเคลื่อนการตัดสินใจที่รอบรู้ ตั้งแต่การรวมข้อมูลการขายกับข้อมูลผลิตภัณฑ์ไปจนถึงการวิเคราะห์ห่วงโซ่อุปทานระดับโลก การเรียนรู้เทคนิคเหล่านี้จะช่วยให้คุณสามารถรับมือกับงานจัดการข้อมูลที่ซับซ้อนได้อย่างมั่นใจ อย่าลืมพิจารณาถึงผลกระทบด้านประสิทธิภาพเมื่อทำงานกับชุดข้อมูลขนาดใหญ่ และใช้ประโยชน์จากคุณสมบัติขั้นสูงเช่นพารามิเตอร์ `indicator` และ `validate` เพื่อการวิเคราะห์ที่แข็งแกร่งและลึกซึ้งยิ่งขึ้น