pandas組隊學習task06

晃晃我的半瓶水發表於2020-12-29
import numpy as np
import pandas as pd

關係型連線

連線的基本概念

把兩張相關的表按照某一個或某一組鍵連線起來即為連線表,關係型連線中,鍵常用on表示並且十分重要.同時連線的形式也十分重要,pandas中關係型連線函式有mergejoin,其中提供how引數代表連線形式,

  1. 左連線left:以左邊的鍵為準,若右邊鍵在左邊存在則新增到左邊,否則處理為缺失值.
  2. 右連線right:類似於左連線
  3. 內連線inner:只合並左右表同時出現的鍵.
  4. 外連線outer:在內連線的基礎上包含左邊出現及只在右邊出現的值,又稱全連線

** 注意: ** 若左右兩表的鍵同時出現重複時,需要通過笛卡爾積的方式加入,單邊出現的時候則根據連線形式進行處理然後逐個匹配,

** 不含重複鍵 **
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-T4TvBGeK-1609256527408)(attachment:image.png)]
** 含重複鍵 **
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-J3PDgEvf-1609256527413)(attachment:image.png)]

值連線

兩表根據某幾列的組合進行連線,這種連線可以通過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')
NameAgeGender
0San Zhang20NaN
1Si Li30F
#當兩個表中想要連線的列不具備相同的列名則可以通過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')
df1_nameAgedf2_nameGender
0San Zhang20NaNNaN
1Si Li30Si LiF
#兩表中列出現重複列名時,通過`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'])

NameGrade_ChineseGrade_Math
0San Zhang7080
#出現重複元素時通過指定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', how='left')#錯誤結果
NameAgeClass_xGenderClass_y
0San Zhang20oneFtwo
1San Zhang20oneMone
2San Zhang21twoFtwo
3San Zhang21twoMone
df1.merge(df2, on=['Name','Class'], how = 'left')
NameAgeClassGender
0San Zhang20oneM
1San Zhang21twoF
#當連線的鍵不滿足唯一性時,需要通過使用duplicated檢查是否重複
#以及使用merge函式中validate引數檢查連線的唯一性模式:1:1(左右鍵均唯一),1:m(左鍵維一),m:1(右鍵唯一);

索引連線

即將索引作為鍵進行連線,pandas中利用join函式處理索引連線,其引數個數少於merge,除onhow外,有對重複列指定左右字尾lsuffixrsuffix,on引數指索引名,單層索引時省略參數列示按照當前索引連線

df1 = pd.DataFrame({'Age':[20,30]},
                    index=pd.Series(
                     ['San Zhang','Si Li'],name='Name'))
 

df2 = pd.DataFrame({'Gender':['F','M']},
                    index=pd.Series(
                    ['Si Li','Wu Wang'],name='Name'))
df1.join(df2, how='left')
AgeGender
Name
San Zhang20NaN
Si Li30F
df1 = pd.DataFrame({'Grade':[70]},
                    index=pd.Series(['San Zhang'],
                   name='Name'))
 

df2 = pd.DataFrame({'Grade':[80]},
                    index=pd.Series(['San Zhang'],
                    name='Name'))
df1.join(df2, how='left',lsuffix='_Chinese',rsuffix='_Math')

Grade_ChineseGrade_Math
Name
San Zhang7080
#使用join實現多級索引
df1 = pd.DataFrame({'Age':[20,21]},
                    index=pd.MultiIndex.from_arrays(
                    [['San Zhang', 'San Zhang'],['one', 'two']],
                    names=('Name','Class')))

df2 = pd.DataFrame({'Gender':['F', 'M']},
                    index=pd.MultiIndex.from_arrays(
                    [['San Zhang', 'San Zhang'],['two', 'one']],
                    names=('Name','Class')))
df1.join(df2)
AgeGender
NameClass
San Zhangone20M
two21F

方向連線

concat

將兩張表或多個表按照縱向或則橫向拼接, concat常用引數有axis(拼接方向),join(連線形式),keys(新表中指示來自於哪張舊錶的名字)
預設狀態下axis為0,表示縱向拼接多個表,常用於多個樣本的拼接,當axis為1時表示橫向拼接多個表,常用於多個欄位和特徵的拼接.
** 注意: **當需要使用多表方向合併時,需要首先用reset_index方法恢復預設整數索引再進行合併,防止出現由索引的誤對齊和重複索引的笛卡爾積帶來的錯誤結果.keys用在當多個表合併後,標識新表中的資料來源,可通過keys引數殘生多級索引進行標記.

df1 = pd.DataFrame({'Name':['San Zhang','Si Li'],
                    'Age':[20,30]})
df2 = pd.DataFrame({'Name':['Wu Wang'], 'Age':[40]})

pd.concat([df1, df2])#縱向拼接
NameAge
0San Zhang20
1Si Li30
0Wu Wang40
df2 = pd.DataFrame({'Grade':[80, 90]})
df3 = pd.DataFrame({'Gender':['M', 'F']})
pd.concat([df1, df2, df3], 1)#橫向合併各表中的欄位
NameAgeGradeGender
0San Zhang2080M
1Si Li3090F
df2 = pd.DataFrame({'Name':['Wu Wang'], 'Gender':['M']})
pd.concat([df1, df2])
NameAgeGender
0San Zhang20.0NaN
1Si Li30.0NaN
0Wu WangNaNM
df2 = pd.DataFrame({'Grade':[80, 90]}, index=[1, 2])
pd.concat([df1, df2], 1)
NameAgeGrade
0San Zhang20.0NaN
1Si Li30.080.0
2NaNNaN90.0
pd.concat([df1, df2], axis=1, join='inner')

NameAgeGrade
1Si Li3080
df1 = pd.DataFrame({'Name':['San Zhang','Si Li'],
                    'Age':[20,21]})
df2 = pd.DataFrame({'Name':['Wu Wang'],'Age':[21]})
pd.concat([df1, df2], keys=['one', 'two'])
NameAge
one0San Zhang20
1Si Li21
two0Wu Wang21

相關文章