提供了類似于SQL的join接口,供我們進行多表組合。不同的是,pandas可以對index進行join
### 2.3.1. Concatenate
將數據集拼接在一起
```
# 樣本數據
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
```
df1 df2 df3如圖

```
#拼接結果如下
result = pd.concat([df1,df2,df3])
```

*****
```
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
#axis=1進行拼接,兩張表橫向相同的索引放在同一行。兩張表的列并列拼接
pd.concat([df1, df4], axis=1)
#結果如下
```

*****
```
#axis=0,兩張表行并列。兩張表列名相同的列放在同一列
a =pd.concat([df1, df4], axis=0)
```

*****
```
# axis=1,join='inner'。 兩張表的列并列放,在行上,只保留
#兩張表共有的橫向索引行
pd.concat([df1, df4], axis=1, join='inner')
```
*****
```
# axis=0,join='inner'。 兩張表的行并列放,在列上,只保留
#兩張表共有列。兩張表列名相同的列放在同一列。
b=pd.concat([df1, df4], axis=0, join='inner')
b
#結果如下圖
```

*****
```
# 將兩張表按axis=0拼接后。對橫向索引從0開始,重排序
d=pd.concat([df1, df4],ignore_index=True,axis=0)
d
```

*****
```
# 將兩張表按axis=1拼接后。對拼接結果的列從0開始重新命名
d=pd.concat([df1, df4],ignore_index=True,axis=1)
d
```

### 2.3.2. Database-style DataFrame joining/merging
**要參照sql的表連接**
merge函數用來對兩張表進行join,非常類似于sql當中的表聯結。 pandas里面不僅可以對columns進行Join,還可以對index進行join。
~~~python
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
~~~
```
# 基于key列將兩張表連接
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
#兩張表都有"key"列
result = pd.merge(left, right, on='key')
#假如兩張表要連接的列列名不同,要分別指定基于左表的哪列(left_on='key')和基于右表的哪列(right_on = 'key')
pd.merge(left, right, left_on='key',right_on = 'key')
```

*****
**根據多個主鍵進行join**
```
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
#將兩張表多列主鍵都一樣的行join,不一樣的主鍵行都舍棄
result = pd.merge(left, right, on=['key1', 'key2'])
```

*****
```
#連接方式:左連接(how='left')。左邊表為基礎進行連接,右邊表沒有對應的行顯示為NaN
result = pd.merge(left, right, how='left', on=['key1', 'key2'],indicator = True)
```

*****
```
#外連接,基于兩張表各自的行進行連接,另一張表若沒有對應的行值都顯示為NaN
result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
```
**joining on index**
```
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
'D': ['D0', 'D2', 'D3']},
index=['K0', 'K2', 'K3'])
#以外連接方式連接,根據左邊表的全部索引(left_index=true)和右邊表的全部索引(right_index=True)
result = pd.merge(left, right, left_index=True, right_index=True, how='outer')
```

*****
```
left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'key': ['K0', 'K1', 'K0', 'K1']})
right = pd.DataFrame({'C': ['C0', 'C1'],
'D': ['D0', 'D1']},
index=['K0', 'K1'])
#左連接的方式連接兩張表。基于左邊表的key列(left_on='key')。基于右邊表的索引列(right_index=True)
result = pd.merge(left, right, left_on='key', right_index=True,
how='left');
```

*****
- 第五節 Pandas數據管理
- 1.1 文件讀取
- 1.2 DataFrame 與 Series
- 1.3 常用操作
- 1.4 Missing value
- 1.5 文本數據
- 1.6 分類數據
- 第六節 pandas數據分析
- 2.1 索引選取
- 2.2. 分組計算
- 2.3. 表聯結
- 2.4. 數據透視與重塑(pivot table and reshape)
- 2.5 官方小結圖片
- 第七節 NUMPY科學計算
- 第八節 python可視化
- 第九節 統計學
- 01 單變量
- 02 雙變量
- 03 數值方法
- 第十節 概率
- 01 概率
- 02 離散概率分布
- 03 連續概率分布
- 第一節 抽樣與抽樣分布
- 01抽樣
- 02 點估計
- 03 抽樣分布
- 04 抽樣分布的性質
- 第十三節 區間估計
- 01總體均值的區間估計:??已知
- 02總體均值的區間估計:??未知
- 03總體容量的確定
- 04 總體比率