import numpy as np
import pandas as pd
關係型連線
連線的基本概念
把兩張相關的表按照某一個或某一組鍵連線起來即為連線表,關係型連線中,鍵常用on
表示並且十分重要.同時連線的形式也十分重要,pandas
中關係型連線函式有merge
和join
,其中提供how
引數代表連線形式,
- 左連線
left
:以左邊的鍵為準,若右邊鍵在左邊存在則新增到左邊,否則處理為缺失值. - 右連線
right
:類似於左連線 - 內連線
inner
:只合並左右表同時出現的鍵. - 外連線
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')
| Name | Age | Gender |
---|
0 | San Zhang | 20 | NaN |
---|
1 | Si Li | 30 | F |
---|
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_name | Age | df2_name | Gender |
---|
0 | San Zhang | 20 | NaN | NaN |
---|
1 | Si Li | 30 | Si Li | F |
---|
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'])
| Name | Grade_Chinese | Grade_Math |
---|
0 | San Zhang | 70 | 80 |
---|
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')
| Name | Age | Class_x | Gender | Class_y |
---|
0 | San Zhang | 20 | one | F | two |
---|
1 | San Zhang | 20 | one | M | one |
---|
2 | San Zhang | 21 | two | F | two |
---|
3 | San Zhang | 21 | two | M | one |
---|
df1.merge(df2, on=['Name','Class'], how = 'left')
| Name | Age | Class | Gender |
---|
0 | San Zhang | 20 | one | M |
---|
1 | San Zhang | 21 | two | F |
---|
索引連線
即將索引作為鍵進行連線,pandas
中利用join
函式處理索引連線,其引數個數少於merge
,除on
和how
外,有對重複列指定左右字尾lsuffix
和rsuffix
,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')
| Age | Gender |
---|
Name | | |
---|
San Zhang | 20 | NaN |
---|
Si Li | 30 | F |
---|
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_Chinese | Grade_Math |
---|
Name | | |
---|
San Zhang | 70 | 80 |
---|
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)
| | Age | Gender |
---|
Name | Class | | |
---|
San Zhang | one | 20 | M |
---|
two | 21 | F |
---|
方向連線
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])
| Name | Age |
---|
0 | San Zhang | 20 |
---|
1 | Si Li | 30 |
---|
0 | Wu Wang | 40 |
---|
df2 = pd.DataFrame({'Grade':[80, 90]})
df3 = pd.DataFrame({'Gender':['M', 'F']})
pd.concat([df1, df2, df3], 1)
| Name | Age | Grade | Gender |
---|
0 | San Zhang | 20 | 80 | M |
---|
1 | Si Li | 30 | 90 | F |
---|
df2 = pd.DataFrame({'Name':['Wu Wang'], 'Gender':['M']})
pd.concat([df1, df2])
| Name | Age | Gender |
---|
0 | San Zhang | 20.0 | NaN |
---|
1 | Si Li | 30.0 | NaN |
---|
0 | Wu Wang | NaN | M |
---|
df2 = pd.DataFrame({'Grade':[80, 90]}, index=[1, 2])
pd.concat([df1, df2], 1)
| Name | Age | Grade |
---|
0 | San Zhang | 20.0 | NaN |
---|
1 | Si Li | 30.0 | 80.0 |
---|
2 | NaN | NaN | 90.0 |
---|
pd.concat([df1, df2], axis=1, join='inner')
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'])
| | Name | Age |
---|
one | 0 | San Zhang | 20 |
---|
1 | Si Li | 21 |
---|
two | 0 | Wu Wang | 21 |
---|