Pandas合并操作(join)

Pandas 常用的合并方法有 joinmergeconcat 三种,本文我们来看看 join 的用法。

join

函数签名:
One_DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)

join 按照索引来合并多个 DataFrame, 因此十分地非常高效。

参数

我们来一个个看看这些参数都是有啥用的。

other

该参数位,可以传递 DataFrameSeriesDataFrame列表。

如果传递的是 Series,则必须指定它的 name 属性,用作 join 时候的列名。

on

可选参数,str 或者 str 组成的 list

比如说我 on=name,那么 One_DataFramename 列当作索引和 other 的索引(这个索引就不一定是 name 了,本来是什么就是什么)来进行 join 操作。如果指定的是列表,那必须 other 也支持相应的多层索引。

how

指定具体的 join 操作方式。

  • left:默认值。使用 One_DataFrame 的索引,或者 One_DataFrameon 作索引
  • right:使用 other 的索引,或者 otheron 作索引
  • outer:使用两者所有指定的索引,并按字典的顺序排序
  • inner:使用两者索引交集作为索引,并按照 One_DataFrame 的索引顺序
lsuffix

如果列名重复,则 One_DataFrame 的重复列名加上这个后缀。

rsuffix

如果列名重复,则 other 的重复列名加上这个后缀。

sort

如果为 True,对结果按照字典顺序排序,如果为 False,则按照 how 关键字所指定的排序。

例子

1
2
>>> a = pd.DataFrame({'ID': [1, 2, 3, 4, 5], 'name': ['a', 'b', 'c', 'd', 'e']})
>>> b = pd.DataFrame({'ID': [2, 3, 4, 6], 'city': ['p2', 'p3', 'p4', 'p6']})
1
2
3
4
5
6
7
>>> a
ID name
0 1 a
1 2 b
2 3 c
3 4 d
4 5 e
1
2
3
4
5
6
>>> b
ID city
0 2 p2
1 3 p3
2 4 p4
3 6 p6
最基本的按照默认索引将两个 DataFrame 合并:
1
2
3
4
5
6
7
>>> a.join(b, rsuffix='_r')
ID name ID_r city
0 1 a 2.0 p2
1 2 b 3.0 p3
2 3 c 4.0 p4
3 4 d 6.0 p6
4 5 e NaN NaN

合并之后,原来列名不一样的数据直接拼进来了,而列名一样的则通过 lsuffix 或者 rsuffix 在原列名后加上了后缀。

通过指定索引合并
1
2
3
4
5
6
7
8
>>> a.set_index('ID').join(b.set_index('ID'))
name city
ID
1 a NaN
2 b p2
3 c p3
4 d p4
5 e NaN

这是 DataFrame a 在左边,我们再看看 DataFrame b 在左边的情形:

1
2
3
4
5
6
7
>>> b.set_index('ID').join(a.set_index('ID'))
city name
ID
2 p2 b
3 p3 c
4 p4 d
6 p6 NaN

发现了没有,join 是以左边(其实是 how 指定的,这里 how 默认为 left)索引作为标准,剔除不存在基准索引的数据,别的 DataFrame 如果没有对应数据就以对应空值替代。

我们让 how=right & a 依然在左边来试验一下对不对:

1
2
3
4
5
6
7
>>> a.set_index('ID').join(b.set_index('ID'), how='right')
name city
ID
2 b p2
3 c p3
4 d p4
6 NaN p6

怎么样,没错吧。

通过指定列来合并

上面我们通过 set_index() 先设置了索引,再按照索引来合并的,还可以直接按指定列来合并:

1
2
3
4
5
6
7
>>> a.join(b, on='ID', rsuffix='_r')
ID name ID_r city
0 1 a 3.0 p3
1 2 b 4.0 p4
2 3 c 6.0 p6
3 4 d NaN NaN
4 5 e NaN NaN

因为默认 how=left,所以 on 指定的是以 a 的 ID 列作为 a 的索引,然后和 b 的默认索引(序号)进行合并。

也就是说 on 参数还是和 how 参数关联的,how 指定哪边,on 参数就是指那边的列作为索引,另外一边不动。

注意:on 指定的列数据类型需要和另一个索引的数据类型相同。

how=inner

how=left/right 都会把两侧的数据都拼接在一起,取的是并集,当 how=inner 时,取的就是交集:

1
2
3
4
5
6
>>> a.set_index('ID').join(b.set_index('ID'), how='inner')
name city
ID
2 b p2
3 c p3
4 d p4

a, b 都有 ID=2,3,4 的,所以最后只剩下了这几个数据。