天天看點

資料科學必備Python使用Pandas資料合并處理

作者:Mr資料楊

Pandas 提供了大量的方法和函數來操作資料,包括合并 DataFrame。合并 DataFrames 允許在不修改原始資料源或更改原始資料源的情況下建立新的 DataFrame。

如果熟悉 SQL 或類似類型的表格資料,可能熟悉術語 join,這意味着将 DataFrame 組合成一個新的 DataFrame。如果是初學者,可能很難完全掌握連接配接類型(内、外、左、右)。

資料科學必備Python使用Pandas資料合并處理

建構需要合并的資料

import pandas as pd
import numpy as np

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

concat 資料合并

資料科學必備Python使用Pandas資料合并處理

concat 縱向合并

frames = [df1, df2, df3]
result = pd.concat(frames)
result
    A   B   C   D
0   A0  B0  C0  D0
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
4   A4  B4  C4  D4
5   A5  B5  C5  D5
6   A6  B6  C6  D6
7   A7  B7  C7  D7
8   A8  B8  C8  D8
9   A9  B9  C9  D9
10  A10 B10 C10 D10
11  A11 B11 C11 D11           

concat 設定索引縱向合并

result = pd.concat(frames, keys=['x', 'y', 'z'])
result
        A   B   C   D
x   0   A0  B0  C0  D0
    1   A1  B1  C1  D1
    2   A2  B2  C2  D2
    3   A3  B3  C3  D3
y   4   A4  B4  C4  D4
    5   A5  B5  C5  D5
    6   A6  B6  C6  D6
    7   A7  B7  C7  D7
z   8   A8  B8  C8  D8
    9   A9  B9  C9  D9
    10  A10 B10 C10 D10
    11  A11 B11 C11 D11           

concat 橫向合并

df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
              'D': ['D2', 'D3', 'D6', 'D7'],
              'F': ['F2', 'F3', 'F6', 'F7']},
             index=[2, 3, 6, 7])


result = pd.concat([df1, df4], axis=1)
result
    A   B   C   D   B   D   F
0   A0  B0  C0  D0  NaN NaN NaN
1   A1  B1  C1  D1  NaN NaN NaN
2   A2  B2  C2  D2  B2  D2  F2
3   A3  B3  C3  D3  B3  D3  F3
6   NaN NaN NaN NaN B6  D6  F6
7   NaN NaN NaN NaN B7  D7  F7           

concat 内連接配接合并

result = pd.concat([df1, df4], axis=1, join='inner')
result
    A   B   C   D   B   D   F
2   A2  B2  C2  D2  B2  D2  F2
3   A3  B3  C3  D3  B3  D3  F3           

concat 按索引橫向合并

result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])
result
    A   B   C   D   B   D   F
0   A0  B0  C0  D0  NaN NaN NaN
1   A1  B1  C1  D1  NaN NaN NaN
2   A2  B2  C2  D2  B2  D2  F2
3   A3  B3  C3  D3  B3  D3  F3           

append 資料合并

資料科學必備Python使用Pandas資料合并處理

append 縱向追加合并

result = df1.append(df2)
result
    A   B   C   D
0   A0  B0  C0  D0
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
4   A4  B4  C4  D4
5   A5  B5  C5  D5
6   A6  B6  C6  D6
7   A7  B7  C7  D7           

append 縱向追加包含nan

result = df1.append(df4)
result
    A   B   C   D   F
0   A0  B0  C0  D0  NaN
1   A1  B1  C1  D1  NaN
2   A2  B2  C2  D2  NaN
3   A3  B3  C3  D3  NaN
2   NaN B2  NaN D2  F2
3   NaN B3  NaN D3  F3
6   NaN B6  NaN D6  F6
7   NaN B7  NaN D7  F7           

append 一次追加多個df

result = df1.append([df2, df3])
result
    A   B   C   D
0   A0  B0  C0  D0
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
4   A4  B4  C4  D4
5   A5  B5  C5  D5
6   A6  B6  C6  D6
7   A7  B7  C7  D7
8   A8  B8  C8  D8
9   A9  B9  C9  D9
10  A10 B10 C10 D10
11  A11 B11 C11 D11           

append 忽略連接配接軸上的索引

result = pd.concat([df1, df4], ignore_index=True)
result
    A   B   C   D   F
0   A0  B0  C0  D0  NaN
1   A1  B1  C1  D1  NaN
2   A2  B2  C2  D2  NaN
3   A3  B3  C3  D3  NaN
4   NaN B2  NaN D2  F2
5   NaN B3  NaN D3  F3
6   NaN B6  NaN D6  F6
7   NaN B7  NaN D7  F7           

append 結合Series列合并

s1 = pd.Series(['X0', 'X1', 'X2', 'X3'], name='X')

result = pd.concat([df1, s1], axis=1)
result
    A   B   C   D   X
0   A0  B0  C0  D0  X0
1   A1  B1  C1  D1  X1
2   A2  B2  C2  D2  X2
3   A3  B3  C3  D3  X3


s2 = pd.Series(['_0', '_1', '_2', '_3'])
result = pd.concat([df1, s2, s2, s2], axis=1)
result
    A   B   C   D   0   1   2
0   A0  B0  C0  D0  _0  _0  _0
1   A1  B1  C1  D1  _1  _1  _1
2   A2  B2  C2  D2  _2  _2  _2
3   A3  B3  C3  D3  _3  _3  _3           

append 結合Series行合并

s2 = pd.Series(['X0', 'X1', 'X2', 'X3'], index=['A', 'B', 'C', 'D'])
result = df1.append(s2, ignore_index=True)
result
    A   B   C   D
0   A0  B0  C0  D0
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
4   X0  X1  X2  X3           

merge 資料合并

資料科學必備Python使用Pandas資料合并處理

merge 單鍵關聯合并

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']})

result = pd.merge(left, right, on='key')
result
    key A   B   C   D
0   K0  A0  B0  C0  D0
1   K1  A1  B1  C1  D1
2   K2  A2  B2  C2  D2
3   K3  A3  B3  C3  D3           

merge 多鍵關聯合并

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']})


result = pd.merge(left, right, on=['key1', 'key2'])
    key1 key2 A  B   C   D
0   K0  K0  A0  B0  C0  D0
1   K1  K0  A2  B2  C1  D1
2   K1  K0  A2  B2  C2  D2


result = pd.merge(left, right, how='left', on=['key1', 'key2'])
result
   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


result = pd.merge(left, right, how='right', on=['key1', 'key2'])
result
    key1 key2   A   B   C   D
0   K0  K0  A0  B0  C0  D0
1   K1  K0  A2  B2  C1  D1
2   K1  K0  A2  B2  C2  D2
3   K2  K0  NaN NaN C3  D3


result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
result
    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   K2  K0  NaN NaN C3  D3


left = pd.DataFrame({'A' : [1,2], 'B' : [2, 2]})
right = pd.DataFrame({'A' : [4,5,6], 'B': [2,2,2]})
result = pd.merge(left, right, on='B', how='outer')
result
    A_x B   A_y
0   1   2   4
1   1   2   5
2   1   2   6
3   2   2   4
4   2   2   5
5   2   2   6           

merge 合并訓示符

df1 = pd.DataFrame({'col1': [0, 1], 'col_left':['a', 'b']})
df2 = pd.DataFrame({'col1': [1, 2, 2],'col_right':[2, 2, 2]})
pd.merge(df1, df2, on='col1', how='outer', indicator=True)
    col1    col_left    col_right   _merge
0   0       a           NaN         left_only
1   1       b           2.0         both
2   2       NaN         2.0         right_only
3   2       NaN         2.0         right_only


pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column')
    col1    col_left    col_right   indicator_column
0   0       a           NaN         left_only
1   1       b           2.0         both
2   2       NaN         2.0         right_only
3   2       NaN         2.0         right_only           

join 資料合并

資料科學必備Python使用Pandas資料合并處理

join 索引進行連接配接

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'])
result = left.join(right)
result
    A   B   C   D
K0  A0  B0  C0  D0
K1  A1  B1  NaN NaN
K2  A2  B2  C2  D2


result = left.join(right, how='outer')
result
    A   B   C   D
K0  A0  B0  C0  D0
K1  A1  B1  NaN NaN
K2  A2  B2  C2  D2
K3  NaN NaN C3  D3


left.join(right, how='inner')
    A   B   C   D
K0  A0  B0  C0  D0
K2  A2  B2  C2  D2           

join 通過索引、列連接配接

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'])
result = left.join(right, on='key')
result
    A   B   key C   D
0   A0  B0  K0  C0  D0
1   A1  B1  K1  C1  D1
2   A2  B2  K0  C0  D0
3   A3  B3  K1  C1  D1           

等同于

pd.merge(left, right, left_on='key', right_index=True, how='left', sort=False)
    A   B   key C   D
0   A0  B0  K0  C0  D0
1   A1  B1  K1  C1  D1
2   A2  B2  K0  C0  D0
3   A3  B3  K1  C1  D1           

其他合并

重疊列名稱的合并

left = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'v': [1, 2, 3]})
right = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'v': [4, 5, 6]})
result = pd.merge(left, right, on='k')
result
    k   v_x v_y
0   K0  1   4
1   K0  1   5


pd.merge(left, right, on='k', suffixes=['_l', '_r'])
    k   v_l v_r
0   K0  1   4
1   K0  1   5           

資料框拼接

df1 = pd.DataFrame([[np.nan, 3., 5.], [-4.6, np.nan, np.nan],
                    [np.nan, 7., np.nan]])
df2 = pd.DataFrame([[-42.6, np.nan, -8.2], [-5., 1.6, 4]],
                    index=[1, 2])

df1.combine_first(df2)
    0       1       2
0   NaN     3.0     5.0
1   -4.6    NaN     -8.2
2   -5.0    7.0     4.0           

資料更新

如果都存在的值以傳入的資料框為準。

df1.update(df2)
df1
    0       1       2
0   NaN     3.0     5.0
1   -42.6   NaN     -8.2
2   -5.0    1.6     4.0