表合,主鍵合並
1.表合並
def concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)
參數含義:
-
objs
:Series,DataFrame或Panel對象的序列或映射。如果傳遞了dict,則排序的鍵將用作鍵參數,除非它被傳遞,在這種情況下,將選擇值(見下文)。任何無對象將被靜默刪除,除非它們都是無,在這種情況下將引發一個ValueError。 -
axis
:{0,1,...},默認為0。沿着連接的軸。 -
join
:{'inner','outer'},默認為“outer”。如何處理其他軸上的索引。outer為聯合和inner為交集。 -
ignore_index
:boolean,default False。如果為True,請不要使用並置軸上的索引值。結果軸將被標記為0,...,n-1。如果要連接其中並置軸沒有有意義的索引信息的對象,這將非常有用。注意,其他軸上的索引值在連接中仍然受到尊重。 -
join_axes
:Index對象列表。用於其他n-1軸的特定索引,而不是執行內部/外部設置邏輯。 -
keys
:序列,默認值無。使用傳遞的鍵作為最外層構建層次索引。如果為多索引,應該使用元組。 -
levels
:序列列表,默認值無。用於構建MultiIndex的特定級別(唯一值)。否則,它們將從鍵推斷。 -
names
:list,default無。結果層次索引中的級別的名稱。 -
verify_integrity
:boolean,default False。檢查新連接的軸是否包含重復項。這相對於實際的數據串聯可能是非常昂貴的。 -
copy
:boolean,default True。如果為False,請勿不必要地復制數據。圖解內外連接:
橫向堆疊外連接:
橫向堆疊內連接:
構建數據
columns = ['姓名', '年齡', '班級', ]
data = [['碼雲', np.nan, 1014], ['李佳乘', 16, 1015],
['李愷符', 20, 1015, ], ['馬畫藤', 18, 1014]]
df1 = pd.DataFrame(columns=columns, data=data)
columns2 = ['成績', '年齡', '性別']
data2 = [[88, 1, 1], [82, 2, 1], [90, 2, 1], [99, 3, 0]]
df2 = pd.DataFrame(columns=columns2, data=data2)
print('df1:\n', df1)
print('------------------')
print('df2:\n', df2)
print('------------------')
1.橫向堆疊,內連接
join='inner' 內連接
橫向堆疊只看,行索引,行索引一樣就可以堆疊
print(pd.concat([df1, df2], axis=1, join='inner'))
#
df1:
姓名 年齡 班級
0 碼雲 NaN 1014
1 李佳乘 16.0 1015
2 李愷符 20.0 1015
3 馬畫藤 18.0 1014
------------------
df2:
成績 年齡 性別
0 88 1 1
1 82 2 1
2 90 2 1
3 99 3 0
------------------
姓名 年齡 班級 成績 年齡 性別
0 碼雲 NaN 1014 88 1 1
1 李佳乘 16.0 1015 82 2 1
2 李愷符 20.0 1015 90 2 1
3 馬畫藤 18.0 1014 99 3 0
2.橫向堆疊,外連接
默認 join='outer'
print(pd.concat([df1,df2],axis=1))
姓名 年齡 班級 成績 年齡 性別
0 碼雲 NaN 1014 88 1 1
1 李佳乘 16.0 1015 82 2 1
2 李愷符 20.0 1015 90 2 1
3 馬畫藤 18.0 1014 99 3 0
3.縱向堆疊,內連接
print(pd.concat([df1, df2], axis=0, join='inner'))
# 兩個表共有的進行
df1:
姓名 年齡 班級
0 碼雲 NaN 1014
1 李佳乘 16.0 1015
2 李愷符 20.0 1015
3 馬畫藤 18.0 1014
------------------
df2:
成績 年齡 性別
0 88 1 1
1 82 2 1
2 90 2 1
3 99 3 0
------------------
年齡
0 NaN
1 16.0
2 20.0
3 18.0
0 1.0
1 2.0
2 2.0
3 3.0
2.主鍵合並
用途:
pandas中的merge()函數類似於SQL中join的用法,可以將不同數據集依照某些字段(屬性)進行合並操作,得到一個新的數據集。
源碼:
def merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=False,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
參數 | 說明 |
---|---|
left,right | 要合並的左側,和右側 |
how | 默認為inner,可設為inner/outer/left/right |
on | 根據某個字段進行連接,必須存在於兩個DateFrame中(若未同時存在,則需要分別使用left_on和right_on來設置) |
left_on | 左連接,以DataFrame1中用作連接鍵的列 |
right_on | 右連接,以DataFrame2中用作連接鍵的列 |
left_index | 將DataFrame1行索引用作連接鍵 |
right_index | 將DataFrame2行索引用作連接鍵 |
sort | 根據連接鍵對合並后的數據進行排列,默認為True |
suffixes | 對兩個數據集中出現的重復列,新數據集中加上后綴_x,_y進行區別 |
構建數據
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', 'K3'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
print('left:\n', left)
print('--------------------')
print('right:\n', right)
print('--------------------')
#
left:
key1 key2 A B
0 K0 K0 A0 B0
1 K0 K1 A1 B1
2 K1 K0 A2 B2
3 K2 K1 A3 B3
--------------------
right:
key1 key2 C D
0 K0 K0 C0 D0
1 K1 K0 C1 D1
2 K1 K0 C2 D2
3 K3 K0 C3 D3
--------------------
1.內連接:只保留公共的主鍵
print(pd.merge(left, right, on='key1'))
#
key1 key2_x A B key2_y C D
0 K0 K0 A0 B0 K0 C0 D0
1 K0 K1 A1 B1 K0 C0 D0
2 K1 K0 A2 B2 K0 C1 D1
3 K1 K0 A2 B2 K0 C2 D2
2.外連接:保留所有的數據
print(pd.merge(left, right, on='key1', how='outer'))
#
key1 key2_x A B key2_y C D
0 K0 K0 A0 B0 K0 C0 D0
1 K0 K1 A1 B1 K0 C0 D0
2 K1 K0 A2 B2 K0 C1 D1
3 K1 K0 A2 B2 K0 C2 D2
4 K2 K1 A3 B3 NaN NaN NaN
5 K3 NaN NaN NaN K0 C3 D3
3.左連接:以坐標中的鍵為主
print(pd.merge(left, right, on='key1', how='left'))
key1 key2_x A B key2_y C D
0 K0 K0 A0 B0 K0 C0 D0
1 K0 K1 A1 B1 K0 C0 D0
2 K1 K0 A2 B2 K0 C1 D1
3 K1 K0 A2 B2 K0 C2 D2
4 K2 K1 A3 B3 NaN NaN NaN
4.右連接:以右表中的鍵為主
print(pd.merge(left, right, on='key1', how='right'))
key1 key2_x A B key2_y C D
0 K0 K0 A0 B0 K0 C0 D0
1 K0 K1 A1 B1 K0 C0 D0
2 K1 K0 A2 B2 K0 C1 D1
3 K1 K0 A2 B2 K0 C2 D2
4 K3 NaN NaN NaN K0 C3 D3
5.多個主鍵
print(pd.merge(left, right, on=['key1','key2'], how='outer'))
#
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K0 K1 A1 B1 NaN NaN
2 K1 K0 A2 B2 C1 D1
3 K1 K0 A2 B2 C2 D2
4 K2 K1 A3 B3 NaN NaN
5 K3 K0 NaN NaN C3 D3
6.名稱不一致時,不要聲明主鍵
print(pd.merge(left, right,left_on='key1', right_on='key2', how='outer'))
key1_x key2_x A B key1_y key2_y C D
0 K0 K0 A0 B0 K0 K0 C0 D0
1 K0 K0 A0 B0 K1 K0 C1 D1
2 K0 K0 A0 B0 K1 K0 C2 D2
3 K0 K0 A0 B0 K3 K0 C3 D3
4 K0 K1 A1 B1 K0 K0 C0 D0
5 K0 K1 A1 B1 K1 K0 C1 D1
6 K0 K1 A1 B1 K1 K0 C2 D2
7 K0 K1 A1 B1 K3 K0 C3 D3
8 K1 K0 A2 B2 NaN NaN NaN NaN
9 K2 K1 A3 B3 NaN NaN NaN NaN
7.重疊合並
dict1 = {'ID':[1,2,3,4,5,6,7,8,9],
'System':['W10','w10',np.nan,'w10',np.nan,np.nan,'w7','w7','w8']}
dict2 = {'ID':[1,2,3,4,5,6,7,8,9],
'System':[np.nan,np.nan,'w7','w7','w7','w7','w8',np.nan,np.nan]}
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
print(df1)
print(df2)
print(df2.combine_first(df1))