文章目錄
- 軸向堆疊數據——concat()函數
- 橫向堆疊與外連接
- 縱向堆疊與內連接
- 主鍵合并數據——merge()函數
- 內連接方式
- 外連接方式
- 左連接方式
- 右連接方式
- 其他
- 根據行索引合并數據——join()方法
- 四種連接方式
- 行索引與列索引重疊
- 合并重疊數據——combine_first()方法
軸向堆疊數據——concat()函數
pandas.concat(
objs: Union[
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
],
axis=0,
join=“outer”,
ignore_index: bool = False,
keys=None,
levels=None,
names=None,
verify_integrity: bool = False,
sort: bool = False,
copy: bool = True,
)
上述函數中常用參數表示的含義如下:
join:表示連接的方式,inner表示內連接,outer表示外連接,默認使用外連接。
ignore_index:接受布爾值,默認為False。如果設置為True,則表示清除現有索引并重置索引值。
keys:接受序列,表示添加最外層索引。
levels:用于構建MultiIndex的特定級別(唯一值)
names:在設置了keys和levels參數后,用于創建分層級別的名稱
verify_integerity:檢查新的連接軸是否包含重復項。接收布爾值,當設置為True時,如果有重復的軸將會拋出錯誤,默認為False
根據軸方向的不同(axis參數),可以將堆疊分成橫向堆疊和縱向堆疊,默認采用的是縱向堆疊方式。在堆疊數據時,默認采用的是外連接,(join參數設為outer)的方式。
橫向堆疊與外連接
使用concat()函數合并時,若是將axis參數的值設為1,且join參數的值設為outer,則合并方式為橫向堆疊與外連接。
測試對象:
left:A B
a A0 B0
b A1 B1
right:C D
c C0 D0
d C1 D1
代碼:
left = pd.DataFrame({'A': ['A0', 'A1'],'B': ['B0', 'B1']},index=['a', 'b'])
right = pd.DataFrame({'C': ['C0', 'C1'],'D': ['D0', 'D1']},index=['c', 'd'])
print(pd.concat([left, right], join='outer', axis=1))
輸出結果:
A B C D
a A0 B0 NaN NaN
b A1 B1 NaN NaN
c NaN NaN C0 D0
d NaN NaN C1 D1
使用concat()函數合并之后產生的不存在的數據將用NaN進行填充。
縱向堆疊與內連接
使用concat()函數合并時,若是將axis參數的值設為0,且join參數的值設為inner,則合并方式為縱向堆疊與內連接。
測試對象:
df1:A B C
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
df2:B C D
0 B3 C3 D3
1 B4 C4 D4
2 B5 C5 D5
代碼:
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'C': ['C0', 'C1', 'C2']})
df2 = pd.DataFrame({'B': ['B3', 'B4', 'B5'],'C': ['C3', 'C4', 'C5'],'D': ['D3', 'D4', 'D5']})
print(pd.concat([df1, df2], join='inner', axis=0))
輸出結果
B C
0 B0 C0
1 B1 C1
2 B2 C2
0 B3 C3
1 B4 C4
2 B5 C5
主鍵合并數據——merge()函數
主鍵合并根據一個或多個鍵將不同的DaraFrame對象連接起來,大多數是將兩個DataFrame對象中重疊的列作為合并的鍵。
merge(
left,
right,
how: str = “inner”,
on=None,
left_on=None,
right_on=None,
left_index: bool = False,
right_index: bool = False,
sort: bool = False,
suffixes=("_x", “_y”),
copy: bool = True,
indicator: bool = False,
validate=None,
)
上述函數中部分參數表示的含義如下:
- left:參與合并的的左側DataFrame對象
- right:參與合并的的右側DataFrame對象
- how:表示連接方式,默認為inner,該參數支持以下的取值:
· left:使用左側的DataFrame的鍵,類似于SQL的左外連接
· right:使用右側的DataFrame的鍵,類似于SQL的右外連接
· outer:使用兩個DataFrame所有的鍵,類似于SQL的全連接
· inner:使用兩個DataFrame鍵的交集,類似于SQL的內連接 - on:用于連接的列名。必須存在于左右兩個DataFrame對象中
- left_on:以左側的DataFrame作為連接鍵
- right_on:以右側的DataFrame作為連接鍵
- left_index:左側的行索引用作連接鍵
- right_index:右側的行索引用作連接鍵
- sort:是否排序,接受布爾值,默認為False
- suffixes:用于追加都重疊列名的末尾,默認為(_x,_y)
內連接方式
默認采用how=inner的方式合并
測試對象:
df1:A B C
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
df3:B C D
0 B0 C0 D3
1 B2 C2 D4
2 B4 C4 D5
代碼:
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'C': ['C0', 'C1', 'C2']})
df3 = pd.DataFrame({'B': ['B0', 'B2', 'B4'],'C': ['C0', 'C2', 'C4'],'D': ['D3', 'D4', 'D5']})
print("pd.merge:\n", pd.merge(df1, df3, on=['B', 'C']))
輸出結果:
pd.merge:A B C D
0 A0 B0 C0 D3
1 A2 B2 C2 D4
外連接方式
外連接方式(how=outer):left與right列中相同的數據將會重疊,沒有數據的位置使用NaN進行填充。
測試對象:
df1:A B C
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
df3:B C D
0 B0 C0 D3
1 B2 C2 D4
2 B4 C4 D5
代碼:
print("pd.merge(how=outer):\n", pd.merge(df1, df3, on=['B', 'C'], how='outer'))
輸出結果:
pd.merge(how=outer):A B C D
0 A0 B0 C0 D3
1 A1 B1 C1 NaN
2 A2 B2 C2 D4
3 NaN B4 C4 D5
左連接方式
左連接方式(how=left):以左表作為基準進行連接,left表中的數據會全部顯示,right表中只會顯示與重疊數據行索引值相同的數據,合并后表中缺失的數據會使用NaN進行填充。
測試對象:
df1:A B C
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
df3:B C D
0 B0 C0 D3
1 B2 C2 D4
2 B4 C4 D5
代碼:
print("pd.merge(how=left):\n", pd.merge(df1, df3, on=['B', 'C'], how='left'))
輸出結果:
pd.merge(how=left):A B C D
0 A0 B0 C0 D3
1 A1 B1 C1 NaN
2 A2 B2 C2 D4
右連接方式
右連接方式(how=left):以右表作為基準進行連接,right表中的數據會全部顯示,left表中只會顯示與重疊數據行索引值相同的數據,合并后表中缺失的數據會使用NaN進行填充。
測試對象:
df1:A B C
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
df3:B C D
0 B0 C0 D3
1 B2 C2 D4
2 B4 C4 D5
代碼:
print("pd.merge(how=right):\n", pd.merge(df1, df3, on=['B', 'C'], how='right'))
測試結果:
pd.merge(how=right):A B C D
0 A0 B0 C0 D3
1 A2 B2 C2 D4
2 NaN B4 C4 D5
其他
即使兩張表中的行索引與列索引均沒有重疊的部分,也可以使用merge()函數來合并。只需要將參數left_index和right_index的值設置為True即可。
測試對象
left:A B
a A0 B0
b A1 B1
right:C D
c C0 D0
d C1 D1
代碼:
print("pd.merge(left_index=right_index=True):\n",pd.merge(left, right, how='outer', left_index=True, right_index=True))
輸出結果:
A B C D
a A0 B0 NaN NaN
b A1 B1 NaN NaN
c NaN NaN C0 D0
d NaN NaN C1 D1
根據行索引合并數據——join()方法
join(self, other, on=None, how=“left”, lsuffix="", rsuffix="", sort=False)
上述方法常用參數表示的含義如下:
- on:用于連接列名
- how:可從{‘left’,‘right’,‘outer’,‘inner’}中任選一個,默認使用left的方式
- lsuffix:接受字符串,用于在左側重疊的列名后添加后綴名
- rsuffix:接受字符串,用于在右側重疊的列名后添加后綴名
- sort:接受布爾值,根據連接鍵對合并的數據進行排序,默認為False
四種連接方式
測試對象:
data1:A B C
a A0 B0 C0
b A1 B1 C1
c A2 B2 C2
data2:B C D
b B1 C1 D1
c B2 C2 D2
d B3 C3 D3
代碼:
data1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'C': ['C0', 'C1', 'C2']},index=['a', 'b', 'c'])
data2 = pd.DataFrame({'B': ['B1', 'B2', 'B3'],'C': ['C1', 'C2', 'C3'],'D': ['D1', 'D2', 'D3']},index=['b', 'c', 'd'])
print("data1.join(data2, how='outer', lsuffix='one'):\n",data1.join(data2, how='outer', lsuffix='one'))
print("data1.join(data2, how='inner', rsuffix='two'):\n",
data1.join(data2, how='inner', rsuffix='two'))
print("data1.join(data2, how='left', lsuffix='one'):\n",
data1.join(data2, how='left', lsuffix='one'))
print("data1.join(data2, how='right', rsuffix='two'):\n",
data1.join(data2, how='right', rsuffix='two'))
輸出結果:
data1.join(data2, how='outer', lsuffix='one'):A Bone Cone B C D
a A0 B0 C0 NaN NaN NaN
b A1 B1 C1 B1 C1 D1
c A2 B2 C2 B2 C2 D2
d NaN NaN NaN B3 C3 D3
data1.join(data2, how='inner', rsuffix='two'):A B C Btwo Ctwo D
b A1 B1 C1 B1 C1 D1
c A2 B2 C2 B2 C2 D2
data1.join(data2, how='left', lsuffix='one'):A Bone Cone B C D
a A0 B0 C0 NaN NaN NaN
b A1 B1 C1 B1 C1 D1
c A2 B2 C2 B2 C2 D2
data1.join(data2, how='right', rsuffix='two'):A B C Btwo Ctwo D
b A1 B1 C1 B1 C1 D1
c A2 B2 C2 B2 C2 D2
d NaN NaN NaN B3 C3 D3
行索引與列索引重疊
測試對象:
join1:A B key
0 A0 B0 K0
1 A1 B1 K1
2 A2 B2 K2
join2:C D
K0 C0 D0
K1 C1 D1
K2 C2 D2
代碼:
join1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'key': ['K0', 'K1', 'K2']})
join2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],'D': ['D0', 'D1', 'D2']},index=['K0', 'K1', 'K2'])
print("join1.join(join2, on='key'):\n", join1.join(join2, on='key'))
輸出結果:
join1.join(join2, on='key'):A B key C D
0 A0 B0 K0 C0 D0
1 A1 B1 K1 C1 D1
2 A2 B2 K2 C2 D2
合并重疊數據——combine_first()方法
使用combine_first()方法合并兩個DataFrame對象時,必須確保它們的行索引和列索引有重疊的部分。
combine_first(self, other: “DataFrame”)
上述方法中只有一個參數other,該參數用于接收填充缺失值的DataFrame對象。
測試對象:
test1:A B
0 NaN B0
1 A1 NaN
2 A2 B2
3 A3 NaN
test2:A B
1 C0 D0
0 C1 D1
2 C2 D2
代碼:
test1 = pd.DataFrame({'A': [np.nan, 'A1', 'A2', 'A3'],'B': ['B0', np.nan, 'B2', np.nan]})
test2 = pd.DataFrame({'A': ['C0', 'C1', 'C2'],'B': ['D0', 'D1', 'D2']},index=[1, 0, 2])
print("test1.combine_first(test2):\n", test1.combine_first(test2))
輸出結果:
test1.combine_first(test2):A B
0 C1 B0
1 A1 D0
2 A2 B2
3 A3 NaN
從上可知,盡管test2表中的行索引與test1表的行索引順序不同,當用test2表的數據替換test1表的NaN值時,替換數據與缺失數據的索引位置仍然是相同的。例如,test1表中位于第0行第A列的“NaN”需要使用test2表中相同位置的數據“C1"來替換。