pandas task6

小五的眼裡有星星發表於2020-12-29

第六章 連線

一、關係型連線

1.連線的基本概念

左連線,右連線,內連線,外連線。
左連線就是以左邊表裡的鍵為準,如果右邊表裡出現左表利的鍵,就新增到左表裡,否則就不新增。
內連線:只合並兩個表裡同時出現的鍵。
!如果 出現重複的鍵怎麼處理?
原則:只要兩邊同時出現的鍵,就以笛卡爾積的方式加入,如果單邊出現則根據連線的形式加入。
小結:
left:參與合併的左側DataFrame
right:參與合併的右側DataFrame
how:inner、outer、left、right其中之一

2. 值連線

兩張表根據某一列的值來連線,事實上還可以通過幾列值的組合進行連線,這種基於值的連線在pandas中可以由merge函式實現,例如:

df1 = pd.DataFrame({'Name':['San Zhang','Si Li'], 'Age':[20,30]})
df2 = pd.DataFrame({'Name':['Si Li','Wu Wang'], 'Gender':['F','M']})
df1.merge(df2, on='Name', how='left')

output:

這裡的合併都是用merge,以前都是用join。感覺merge更方便一些~
“merge包含了join操作,支援兩個df間行方向或列方向的拼接操作,預設列拼接,取交集,而join只是簡化了merge的行拼接的操作”

如果兩個表中想要連線的列不具備相同的列名,可以通過left_on和right_on指定:

df1 = pd.DataFrame({'df1_name':['San Zhang','Si Li'], 'Age':[20,30]})
df2 = pd.DataFrame({'df2_name':['Si Li','Wu Wang'], 'Gender':['F','M']})
df1.merge(df2, left_on='df1_name', right_on='df2_name', how='left')

output:
在這裡插入圖片描述
如果兩個表中的列出現了重複的列名,那麼可以通過suffixes引數指定。例如:

df1 = pd.DataFrame({'Name':['San Zhang'],'Grade':[70]})
df2 = pd.DataFrame({'Name':['San Zhang'],'Grade':[80]})
df1.merge(df2, on='Name', how='left', suffixes=['_Chinese','_Math'])

合併張三的語文成績和數學成績。
出現重複元素:例如兩位同學來自不同的班級,但是姓名相同,這種時候就要指定on引數為多個列使得正確連線:

df1 = pd.DataFrame({'Name':['San Zhang', 'San Zhang'],
                    'Age':[20, 21],
                    'Class':['one', 'two']})
df2 = pd.DataFrame({'Name':['San Zhang', 'San Zhang'],
                    'Gender':['F', 'M'],
                    'Class':['two', 'one']})
df1.merge(df2, on=['Name', 'Class'], how='left') # 正確的結果

在進行基於唯一性的連線下,如果鍵不是唯一的,那麼結果就會產生問題。如果想要保證唯一性,除了用duplicated檢查是否重複外,merge中也提供了validate引數來檢查連線的唯一性模式。這裡共有三種模式,即一對一連線1:1,一對多連線1:m,多對一連線m:1連線,第一個是指左右表的鍵都是唯一的,後面兩個分別指左表鍵唯一和右表鍵唯一。

3.索引連線

小結:
left_index:將左側的行索引用作其連線鍵的列
right_index:類似於left_index
sort:根據連線鍵對合並後的資料進行排序,預設為True。有時在處理大資料集時,禁用該選項可獲得更好的效能
suffixes:字串值元組,用於追加到重疊列名,預設為(’_x’,’_y’)
copy:設定為False,可以在某些我死情況下避免將資料複製到結果資料結構中,預設總是複製