标签:pandas
pandas中的DataFrame变量的join连接总是记不住,在这里做一个小结,参考资料是官方文档。
pandas.DataFrame.join
DataFrame.join(other, on=None, how=’left’, lsuffix=”, rsuffix=”, sort=False)
通过索引或者指定的列连接两个DataFrame。通过一个list可以一次高效的连接多个DataFrame。
参数说明
- other:【DataFrame,或者带有名字的Series,或者DataFrame的list】如果传递的是Series,那么其name属性应当是一个集合,并且该集合将会作为结果DataFrame的列名
- on:【列名称,或者列名称的list/tuple,或者类似形状的数组】连接的列,默认使用索引连接
- how:【{‘left’, ‘right’, ‘outer’, ‘inner’}, default: ‘left’】连接的方式,默认为左连接
- lsuffix:【string】左DataFrame中重复列的后缀
- rsuffix:【string】右DataFrame中重复列的后缀
- sort:【boolean, default False】按照字典顺序对结果在连接键上排序。如果为False,连接键的顺序取决于连接类型(关键字)。
注释
当需要join的数据是DataFrame的list时,不支持传递参数on
,lsuffix
,sort
实例
先创建join的两个DataFrame型变量
import pandas as pd
caller = pd.DataFrame({'key':['K0', 'K1', 'K2', 'K3', 'K4', 'K5'], 'A':['A0', 'A1', 'A2', 'A3', 'A4', 'A5']})
print caller
结果如下:
A key
0 A0 K0
1 A1 K1
2 A2 K2
3 A3 K3
4 A4 K4
5 A5 K5
other = pd.DataFrame({'key':['K0', 'K1', 'K2','K99'], 'B':['B0', 'B1', 'B2', 'B99']})
print other
结果如下:
B key
0 B0 K0
1 B1 K1
2 B2 K2
3 B99 K99
1. 通过索引连接DataFrame
print caller.join(other, lsuffix='_caller', rsuffix='_other')
结果如下:
A key_caller B key_other
0 A0 K0 B0 K0
1 A1 K1 B1 K1
2 A2 K2 B2 K2
3 A3 K3 B99 K99
4 A4 K4 NaN NaN
5 A5 K5 NaN NaN
2. 通过指定的列连接DataFrame
2.1 先把该列设置为索引,然后再连接,需要同时设定caller和other的索引,连接结果的索引也是指定的列
print caller.set_index('key').join(other.set_index('key'))
结果如下:
A B
key
K0 A0 B0
K1 A1 B1
K2 A2 B2
K3 A3 NaN
K4 A4 NaN
K5 A5 NaN
2.2. 通过on
参数指定连接的列,DataFrame.join总是使用other的索引去连接caller,因此我们可以把指定的列设置为other的索引,然后用on
去指定caller的连接列,这样可以让连接结果的索引和caller一致
print caller.join(other.set_index('key'), on='key')
结果如下:
A key B
0 A0 K0 B0
1 A1 K1 B1
2 A2 K2 B2
3 A3 K3 NaN
4 A4 K4 NaN
5 A5 K5 NaN
print caller.join(other.set_index('key'), on='key', how='inner')
结果如下:
A key B
0 A0 K0 B0
1 A1 K1 B1
2 A2 K2 B2
3.其他连接方式
3.1右连接
print caller.join(other, how='right', lsuffix='_caller', rsuffix='_other')
结果如下:
A key_caller B key_other
0 A0 K0 B0 K0
1 A1 K1 B1 K1
2 A2 K2 B2 K2
3 A3 K3 B99 K99
3.2外连接
print caller.join(other.set_index('key'), on='key', how='outer')
结果如下:
A key B
0 A0 K0 B0
1 A1 K1 B1
2 A2 K2 B2
3 A3 K3 NaN
4 A4 K4 NaN
5 A5 K5 NaN
5 NaN K99 B99
小结
- DataFrame的join和数据库中join的效果一模一样
- DataFrame的join默认为左连接
- DataFrame的join连接时,caller的关键列默认为index,可以使用参数
on
指定别的列为关键列,但是other的关键列永远都是index
,所有使用别的列为关键列是,常常使用set_index()