人生苦短,我用 Pythonpython
前文傳送門:git
小白學 Python 數據分析(1):數據分析基礎github
小白學 Python 數據分析(2):Pandas (一)概述數據結構
小白學 Python 數據分析(3):Pandas (二)數據結構 Seriesspa
小白學 Python 數據分析(4):Pandas (三)數據結構 DataFrameexcel
小白學 Python 數據分析(5):Pandas (四)基礎操做(1)查看數據code
小白學 Python 數據分析(6):Pandas (五)基礎操做(2)數據選擇cdn
小白學 Python 數據分析(7):Pandas (六)數據導入blog
小白學 Python 數據分析(8):Pandas (七)數據預處理索引
小白學 Python 數據分析(9):Pandas (八)數據預處理(2)
小白學 Python 數據分析(10):Pandas (九)數據運算
小白學 Python 數據分析(11):Pandas (十)數據分組
小白學 Python 數據分析(12):Pandas (十一)數據透視表(pivot_table)
說到數據表拼接,就不得不提一下 SQL ,對於熟悉 SQL 的同窗來說,這並非一個難以理解的概念,數據表之間的關係能夠分爲如下這三種:
兩個表之間的公共列是一對一的。
這裏的示例咱們就不用圖片了,直接使用代碼來作展現,緣由嘛就是小編懶的畫了:
import pandas as pd
df1 = pd.read_excel("table_join_exp.xlsx", sheet_name='Sheet1')
print(df1)
# 輸出內容
編號 姓名 分數
0 100 小明 96
1 200 小紅 48
2 300 小王 72
3 400 小剛 72
df2 = pd.read_excel("table_join_exp.xlsx", sheet_name='Sheet2')
print(df2)
# 輸出內容
編號 班級
0 100 1
1 200 2
2 300 3
3 400 4
複製代碼
這裏能夠很直觀的看到,這兩個表的編號是公共列,而且惟一對應。
若是咱們要講這兩個表進行鏈接操做,須要使用 merge()
方法:
print(pd.merge(df1, df2))
# 輸出內容
編號 姓名 分數 班級
0 100 小明 96 1
1 200 小紅 48 2
2 300 小王 72 3
3 400 小剛 72 4
複製代碼
在咱們使用 merge()
方法的時候, merge()
方法會自動尋找兩個表中的公共列,而且自動的進行對應操做。
兩個表之間的公共列不是一對一的,而是其中一個表的公共列是惟一的,另外一個表的公共列則會有重複的數據。
import pandas as pd
df1 = pd.read_excel("table_join_exp.xlsx", sheet_name='Sheet1')
print(df1)
# 輸出內容
編號 姓名 分數
0 100 小明 96
1 200 小紅 48
2 300 小王 72
3 400 小剛 72
df3 = pd.read_excel("table_join_exp.xlsx", sheet_name='Sheet3')
print(df3)
# 輸出內容
編號 分數
0 100 101
1 100 102
2 100 103
3 100 104
4 200 201
5 200 202
6 300 301
7 400 401
複製代碼
從上面這兩個 df 中能夠看到, df1 中的編號在 df3 中會對應多條數據,咱們在對這兩個 df 進行鏈接操做的時候,須要使用屬性 on
指明判斷的條件:
print(pd.merge(df1, df3, on='編號'))
# 輸出內容
編號 姓名 分數_x 分數_y
0 100 小明 96 101
1 100 小明 96 102
2 100 小明 96 103
3 100 小明 96 104
4 200 小紅 48 201
5 200 小紅 48 202
6 300 小王 72 301
7 400 小剛 72 401
複製代碼
兩個表之間的公共列都是會有重複數據的,至關因而多個一對多。
注意理解多個一對多,這裏的邏輯稍微有點繞,小編在第一次接觸 SQL 的時候其實是沒法理解的。
咱們這裏新建一個 df4 ,新增一個編號爲 100 的小黑,仍是經過編號對 df4 和 df3 進行鏈接操做:
df4 = pd.read_excel("table_join_exp.xlsx", sheet_name='Sheet4')
print(df4)
# 輸出結果
編號 姓名 分數
0 100 小明 96
1 100 小黑 100
2 200 小紅 48
3 300 小王 72
4 400 小剛 72
print(pd.merge(df4, df3, on='編號'))
編號 姓名 分數_x 分數_y
0 100 小明 96 101
1 100 小明 96 102
2 100 小明 96 103
3 100 小明 96 104
4 100 小黑 100 101
5 100 小黑 100 102
6 100 小黑 100 103
7 100 小黑 100 104
8 200 小紅 48 201
9 200 小紅 48 202
10 300 小王 72 301
11 400 小剛 72 401
複製代碼
學過 SQL 的同窗都知道, SQL 中鏈接分爲內鏈接、左鏈接、右鏈接和外鏈接,一樣在 Pandas 也是同樣的。
內鏈接就是取兩個表中公共的部分,咱們從新建立一個 df5 ,在 df5 中只有編號 100 和 200 能和前面的數據保持一致:
df5 = pd.read_excel("table_join_exp.xlsx", sheet_name='Sheet5')
print(df5)
# 輸出結果
編號 姓名 分數
0 100 小明 96
1 100 小黑 100
2 200 小紅 48
3 600 想不出來叫啥了1 600
4 700 想不出來叫啥了2 700
# 內鏈接
print(pd.merge(df5, df3, on='編號', how='inner'))
# 輸出結果
編號 姓名 分數_x 分數_y
0 100 小明 96 101
1 100 小明 96 102
2 100 小明 96 103
3 100 小明 96 104
4 100 小黑 100 101
5 100 小黑 100 102
6 100 小黑 100 103
7 100 小黑 100 104
8 200 小紅 48 201
9 200 小紅 48 202
複製代碼
這裏 how
屬性是用來指定鏈接類型的。
左鏈接就是已左表爲基礎,右表像左表上拼數據:
# 左鏈接
print(pd.merge(df5, df3, on='編號', how='left'))
# 輸出結果
編號 姓名 分數_x 分數_y
0 100 小明 96 101.0
1 100 小明 96 102.0
2 100 小明 96 103.0
3 100 小明 96 104.0
4 100 小黑 100 101.0
5 100 小黑 100 102.0
6 100 小黑 100 103.0
7 100 小黑 100 104.0
8 200 小紅 48 201.0
9 200 小紅 48 202.0
10 600 想不出來叫啥了1 600 NaN
11 700 想不出來叫啥了2 700 NaN
複製代碼
能夠看到,在 df5 中,編號 600 和 700 的兩條數據在 df3 中沒有,因此 分數_y 的值爲 NaN 。
右鏈接正好和上面的左鏈接相反,已右表爲基礎,左表往右表上拼數據:
# 右鏈接
print(pd.merge(df5, df3, on='編號', how='right'))
# 輸出結果
編號 姓名 分數_x 分數_y
0 100 小明 96.0 101
1 100 小黑 100.0 101
2 100 小明 96.0 102
3 100 小黑 100.0 102
4 100 小明 96.0 103
5 100 小黑 100.0 103
6 100 小明 96.0 104
7 100 小黑 100.0 104
8 200 小紅 48.0 201
9 200 小紅 48.0 202
10 300 NaN NaN 301
11 400 NaN NaN 401
複製代碼
外鏈接就是兩個表的並集:
# 外鏈接
print(pd.merge(df5, df3, on='編號', how='outer'))
# 輸出結果
編號 姓名 分數_x 分數_y
0 100 小明 96.0 101.0
1 100 小明 96.0 102.0
2 100 小明 96.0 103.0
3 100 小明 96.0 104.0
4 100 小黑 100.0 101.0
5 100 小黑 100.0 102.0
6 100 小黑 100.0 103.0
7 100 小黑 100.0 104.0
8 200 小紅 48.0 201.0
9 200 小紅 48.0 202.0
10 600 想不出來叫啥了1 600.0 NaN
11 700 想不出來叫啥了2 700.0 NaN
12 300 NaN NaN 301.0
13 400 NaN NaN 401.0
複製代碼
顧名思義,縱向拼接就是在縱向上對兩個表進行拼接,固然這須要兩個表具備相同的結構,前面咱們介紹的拼接方式都在橫向上進行拼接。
這裏咱們再加入一個 df6 ,使用 df5 和 df6 演示縱向拼接,在 Pandas 中使用縱向拼接使用的方法是 concat()
:
df6 = pd.read_excel("table_join_exp.xlsx", sheet_name='Sheet6')
print(df6)
# 輸出結果
編號 姓名 分數
0 800 起個名字好難啊 100
1 900 起個名字真的難 200
# 縱向拼接
print(pd.concat([df5, df6]))
# 輸出結果
編號 姓名 分數
0 100 小明 96
1 100 小黑 100
2 200 小紅 48
3 600 想不出來叫啥了1 600
4 700 想不出來叫啥了2 700
0 800 起個名字好難啊 100
1 900 起個名字真的難 200
複製代碼
當咱們使用 concat()
之後,發現索引仍是保留了原有的索引,看着很不舒服,這時咱們能夠設置參數 ignore_index
,讓其不在保留原有索引,而是生成新的索引:
print(pd.concat([df5, df6], ignore_index=True))
# 輸出結果
編號 姓名 分數
0 100 小明 96
1 100 小黑 100
2 200 小紅 48
3 600 想不出來叫啥了1 600
4 700 想不出來叫啥了2 700
5 800 起個名字好難啊 100
6 900 起個名字真的難 200
複製代碼
本篇的分享到這裏就算結束,若是有 SQL 基礎的同窗看起來應該毫無壓力,沒有基礎的同窗推薦本身動手試一下,不少看着不是很理解的東西一動手就立馬打通任督二脈。
老規矩,全部的示例代碼都會上傳至代碼管理倉庫 Github 和 Gitee 上,方便你們取用。