1 join

join方法是DataFrame内置的一种快速合并的方法。

输入help(pd.DataFrame.join)可以得到:

join(self, other, on=None, how='left', lsuffix='', rsuffix='', sort=False) -> 'DataFrame'

1.1 直接调用

join 默认以index作为对齐的列。

# 手动写两个 DataFrame
df1 = pd.DataFrame([[1,2,3],[1,10,20],[5,6,7],[3,9,0],[8,0,3]],columns=['x1','x2','x3'])
df2 = pd.DataFrame([[1,2],[1,10],[1,3],[4,6],[3,9]],columns=['x4','x5'])

# 设置 index
df1.index = ['K'+str(i) for i in range(5)]
df2.index = ['K'+str(i) for i in range(4,-1,-1)]

df1.join(df2)

得到:

    x1  x2  x3  x4  x5
K0  1   2   3   3   9
K1  1   10  20  4   6
K2  5   6   7   1   3
K3  3   9   0   1   10
K4  8   0   3   1   2

1.2 lsuffix 与 rsuffix

lsuffix/rsuffix:两个表中若存在相同名称的列,会给左表/右表相同列名的那一列添加一个后缀

df1 = pd.DataFrame([[1,2,3],[1,10,20],[5,6,7],[3,9,0],[8,0,3]],columns=['x1','x2','x3'])
df2 = pd.DataFrame([[1,2],[1,10],[1,3],[4,6],[3,9]],columns=['x1','x4'])

df1.index = ['K'+str(i) for i in range(5)]
df2.index = ['K'+str(i) for i in range(4,-1,-1)]

df1.join(df2, rsuffix='_2')

得到:

    x1  x2  x3 x1_2 x4
K0  1   2   3   3   9
K1  1   10  20  4   6
K2  5   6   7   1   3
K3  3   9   0   1   10
K4  8   0   3   1   2

1.3 how

how:可以设置为left、right、inner、outer,分别对应左连、右连、内连、外连,默认为左连

df1 = pd.DataFrame([[1,2,3],[1,10,20],[5,6,7],[3,9,0],[8,0,3]],columns=['x1','x2','x3'])
df2 = pd.DataFrame([[1,2],[1,10],[1,3],[4,6],[3,9]],columns=['x1','x4'])

df1.index = ['K'+str(i) for i in range(5)]
df2.index = ['K'+str(i) for i in range(3,8)]

df1.join(df2, rsuffix='_2', how='left')

得到:

    x1  x2  x3  x1_2 x4
K0  1   2   3   NaN NaN
K1  1   10  20  NaN NaN
K2  5   6   7   NaN NaN
K3  3   9   0   1.0 2.0
K4  8   0   3   1.0 10.0

right:

    x1  x2  x3  x1_2 x4
K3  3.0 9.0 0.0 1   2
K4  8.0 0.0 3.0 1   10
K5  NaN NaN NaN 1   3
K6  NaN NaN NaN 4   6
K7  NaN NaN NaN 3   9

inner:

    x1  x2  x3  x1_2 x4
K3  3   9   0   1   2
K4  8   0   3   1   10

outer:

x1  x2  x3  x1_2    x4
K0  1.0 2.0 3.0 NaN NaN
K1  1.0 10.0 20.0 NaN NaN
K2  5.0 6.0 7.0 NaN NaN
K3  3.0 9.0 0.0 1.0 2.0
K4  8.0 0.0 3.0 1.0 10.0
K5  NaN NaN NaN 1.0 3.0
K6  NaN NaN NaN 4.0 6.0
K7  NaN NaN NaN 3.0 9.0

1.4 on

on:右表的索引值正是左表的某一列的值,则可以通过 on 来指定怎么连接,默认为左表的索引值(即二者索引一致)

即使how设为右连也是谁调用 join 就用谁的 on 对应的那一列。

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

left.join(right, on='key')

得到:

    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

2 merge

通过 pd.merge( ) 方法可以自由灵活地操作各种逻辑的数据连接、合并等操作。

输入help(pd.merge) 可以得到如下提示:

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

Merge DataFrame or named Series objects with a database-style join.
  • left、right:需要连接的两个 DataFrame 或 Series,一左一右。
  • how:两个数据连接方式,默认为 inner,可设置为 inner、outer、left 或 right。
  • on:作为连接键的字段,左右数据中都必须存在,否则需要用 left_on 和 right_on 来指定。
  • left_on:左表的连接键字段。
  • right_on:右表的连接键字段。
  • left_index:为 True 时将左表的索引作为连接键,默认为 False。
  • right_index:为 True 时将右表的索引作为连接键,默认为 False。
  • suffixes:如果左右数据出现重复列,新数据表头会用此后缀进行区分,默认为 _x 和 _y。

2.1 on 设置连接键

在数据连接时,如果没有指定根据哪一列(连接键)进行连接,Pandas 会自动找到相同列名的列进行连接,并按左边数据的顺序取交集数据(默认内连接)。为了代码的可阅读性和严谨性,推荐通过 on 参数指定连接键。

df1 = pd.DataFrame({'a': [1, 2], 'x': [5, 6]})
df2 = pd.DataFrame({'a': [2, 1, 0],  'y': [6, 7, 8]})
pd.merge(df1, df2, on='a')

得到:

    a   x   y
0   1   5   7
1   2   6   6

如果在合并数据时需要用多个连接键,可以以列表的形式将这些连接键传入 on 中

df3 = pd.DataFrame({'a': [1, 2], 'b': [3, 4], 'x': [5, 6]})
df4 = pd.DataFrame({'a': [1, 2, 3], 'b': [3, 4, 5],  'y': [6, 7, 8]})

pd.merge(df3, df4, on=['a','b'])
'''
   a  b  x  y
0  1  3  5  6
1  2  4  6  7
'''

pd.merge(df3, df4, on=['a','b'], how='outer')
'''
    a   b   x   y
0   1   3   5.0 6
1   2   4   6.0 7
2   3   5   NaN 8
'''

2.2 left、right_index;left、right_on

可以直接按索引进行连接,将 left_index 和 right_index 设置为 True,会以两个表的索引作为连接键。

pd.merge(df1, df2,
         left_index=True,
         right_index=True,
         suffixes=('_x', '_y') # ('', '_y') 或者 ('_x', '') 就是join中r/l的效果了
        )

得到:

    a_x x   a_y y
0   1   5   2   6
1   2   6   1   7

同时可以通过 left_index = True, right_on = 'key' 或 left_on = 'key', right_on = True 亦或 left_on = 'key1'、 right_on = 'key2' 来进行不同的连接。

最后修改:2022 年 09 月 30 日
如果觉得我的文章对你有用,请随意赞赏