06.Pandas表合並和主鍵合並


表合,主鍵合並

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))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM