ความแตกต่างที่สำคัญระหว่างการผสานและการเชื่อมต่อกันคือการผสานช่วยให้คุณสามารถ "รวม" ตารางที่มีโครงสร้างมากขึ้นโดยที่การใช้ concat กว้างกว่าและมีโครงสร้างน้อยกว่า
ผสาน
อ้างอิงเอกสาร , pd.DataFrame.merge
ใช้เวลาที่เหมาะสมเป็นอาร์กิวเมนต์จำเป็นซึ่งคุณสามารถคิดว่ามันเป็นมาร่วมงานกับตารางด้านซ้ายและด้านขวาของตารางตามที่กำหนดไว้ล่วงหน้าโครงสร้างเข้าร่วมดำเนินงาน หมายเหตุ: ความคมชัดสำหรับพารามิเตอร์ที่เหมาะสม
พารามิเตอร์ที่จำเป็น
- ขวา : DataFrame หรือชื่อ Series
พารามิเตอร์เสริม
- อย่างไร : {'left', 'right', 'outer', 'inner'} default 'inner'
- บน : ป้ายกำกับหรือรายการ
- left_on : ป้ายกำกับหรือรายการหรือเหมือนอาร์เรย์
- right_on : ป้ายกำกับหรือรายการหรือเหมือนอาร์เรย์
- left_index : bool ค่าเริ่มต้น False
- right_index : bool ค่าเริ่มต้น False
- เรียงลำดับ : bool, default False
- คำต่อท้าย : tuple ของ (str, str), ค่าเริ่มต้น ('_x', '_y')
- copy : bool ค่าเริ่มต้น True
- ตัวบ่งชี้ : บูลหรือ str, ค่าเริ่มต้น False
- ตรวจสอบความถูกต้อง : str, ไม่บังคับ
สำคัญ: pd.DataFrame.merge
ต้องการสิทธิ์ในการเป็นpd.DataFrame
หรือตั้งชื่อpd.Series
วัตถุ
เอาต์พุต
นอกจากนี้หากเราตรวจสอบ docstring สำหรับ Merge Operation บนแพนด้าอยู่ด้านล่าง:
ดำเนินการผสานฐานข้อมูล (SQL) ระหว่างออบเจ็กต์ DataFrame หรือ Series สองรายการโดยใช้คอลัมน์เป็นคีย์หรือดัชนีแถว
Concat
อ้างถึงเอกสารของpd.concat
โน้ตแรกที่พารามิเตอร์ไม่มีชื่อใด ๆ ของตาราง data_frame ชุดเมทริกซ์ฯลฯ แต่objsแทน นั่นคือคุณสามารถส่ง "คอนเทนเนอร์ข้อมูล" จำนวนมากซึ่งกำหนดเป็น:
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
พารามิเตอร์ที่จำเป็น
- objs : ลำดับหรือการแม็ปของวัตถุ Series หรือ DataFrame
พารามิเตอร์เสริม
- แกน : {0 / 'ดัชนี', 1 / 'คอลัมน์'}, ค่าเริ่มต้น 0
- เข้าร่วม : {'inner', 'outer'}, default 'outer'
- Ignore_index : bool, default False
- คีย์ : ลำดับค่าเริ่มต้นไม่มี
- ระดับ : รายการลำดับเริ่มต้นไม่มี
- ชื่อ : รายการค่าเริ่มต้นไม่มี
- Verify_integrity : bool, default False
- เรียงลำดับ : bool, default False
- copy : bool ค่าเริ่มต้น True
เอาต์พุต
- ผลตอบแทน : วัตถุประเภทของ objs
ตัวอย่าง
รหัส
import pandas as pd
v1 = pd.Series([1, 5, 9, 13])
v2 = pd.Series([10, 100, 1000, 10000])
v3 = pd.Series([0, 1, 2, 3])
df_left = pd.DataFrame({
"v1": v1,
"v2": v2,
"v3": v3
})
df_right = pd.DataFrame({
"v4": [5, 5, 5, 5],
"v5": [3, 2, 1, 0]
})
df_concat = pd.concat([v1, v2, v3])
merge_result = df_left.merge(df_right, left_index=True, right_index=True)
concat_result = pd.concat([df_left, df_right], sort=False)
print(merge_result)
print('='*20)
print(concat_result)
เอาต์พุตรหัส
v1 v2 v3 v4 v5
0 1 10 0 5 3
1 5 100 1 5 2
2 9 1000 2 5 1
3 13 10000 3 5 0
====================
v1 v2 v3 v4 v5
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
อย่างไรก็ตามคุณสามารถบรรลุผลลัพธ์แรก (ผสาน) กับ concat ได้โดยการเปลี่ยนพารามิเตอร์แกน
concat_result = pd.concat([df_left, df_right], sort=False, axis=1)
สังเกตพฤติกรรมต่อไปนี้
concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)
เอาต์พุต;
v1 v2 v3 v4 v5
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
3 NaN NaN NaN 5.0 0.0
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
3 NaN NaN NaN 5.0 0.0
ซึ่งคุณไม่สามารถดำเนินการที่คล้ายกันกับการผสานได้เนื่องจากอนุญาตให้ใช้ DataFrame เดียวหรือซีรี่ส์ที่มีชื่อเท่านั้น
merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)
เอาต์พุต;
TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed
สรุป
ดังที่คุณอาจสังเกตเห็นแล้วว่าอินพุตและเอาต์พุตอาจแตกต่างกันระหว่าง "merge" และ "concat"
ดังที่ฉันได้กล่าวไว้ในตอนต้นความแตกต่าง (หลัก) ประการแรกคือการ "ผสาน" ทำการรวมที่มีโครงสร้างมากขึ้นกับชุดของวัตถุและพารามิเตอร์ที่ จำกัด โดยที่ "concat" ทำการรวมที่เข้มงวดน้อยกว่า / กว้างกว่ากับชุดที่กว้างกว่า ของวัตถุและพารามิเตอร์
สรุปแล้วการผสานมีความทนทานต่อการเปลี่ยนแปลงน้อยกว่า / (อินพุต) และ "concat" มีความไวต่อการเปลี่ยนแปลงน้อยกว่า / (อินพุต) คุณสามารถ "ผสาน" ได้โดยใช้ "concat" แต่สิ่งที่ตรงกันข้ามไม่ได้เป็นจริงเสมอไป
การดำเนินการ "ผสาน" ใช้คอลัมน์ Data Frame (หรือชื่อของpd.Series
วัตถุ) หรือดัชนีแถวและเนื่องจากจะใช้เอนทิตีเหล่านั้นเท่านั้นจึงทำการผสานในแนวนอนของ Data Frames หรือ Series และไม่ได้ใช้การดำเนินการแนวตั้งเป็นผลลัพธ์
หากคุณต้องการดูเพิ่มเติมคุณสามารถเจาะลึกซอร์สโค้ดได้เล็กน้อย
.merge()
และ.join()
.