pandas.merge和DataFrame.join的用法区别
pandas:merge和DataFrame.join的用法区别
merge
- pandas.merge
- DataFrame.merge 这两个方法的用法一样。
join
- DataFrame.join
- Index.join
- Series.str.join 。简单的字符串连接。
- 3个join用法不一样
Pandas.concat()只是简单的合并表
DataFrame.join(self, other, on = None, how="left", lsuffix="", rsufix="")-> DataFrame
连接2个/多个DataFrame。对于简单的索引合并,你还可以向join传入一组DataFrame。
left2.join([right2, another])
可以通过columns和另一个DataFrame的column或index连接。
⚠️。如果2个DataFrame有相同名字的普通列,需要为2个表加后缀。
关于on的用法:
- 如果没有使用on参数,join函数判断能否index-on-index, 如果2个表有重复列名,需要加上后缀。
- 如果使用了on参数,on指定的列名或index name去连接other表的index 。
DataFrame.merge()
pd.merge(left, right, how="inner", left_on=None, right_on=None, left_index=False, right_index=False)
和join方法类似。但不一样:主要区别在关联方法上:
- join方法
- 默认使用index-on-index,
- 如果有on参数,则用on参数指定的列名/index名来连接other的index。
- merge方法
- 默认,自动把2个表中有相同列名的列(重叠列)作为主键列。
- 最好是明确指定on参数,此时列名/index name必须同时在2个表内出现。
- 或者使用left_on和right_on参数作为连接的key。明确指定2个表要关联的列名/index name
- 或者使用left_index和right_index参数。
总结,都要理解,之后使用哪个就随心了。
案例
如果有相同的列名,则未使用on,和使用on参数的例子:
df1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)}) df2 = pd.DataFrame({'key': list("abc"), "data2": range(3)}) pd.merge(df1, df2) #或者明确使用on参数: pd.merge(df1, df2, on='key')
如果没有相同列名,则使用left_on和right_on的例子:
df3 = pd.DataFrame({'lkey': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],'data1': range(7)}) df4 = pd.DataFrame({'rkey': ['a', 'b', 'd'], 'data2': range(3)}) pd.merge(df3, df4, left_on="lkey", right_on="rkey") # lkey data1 rkey data2 0 b 0 b 1 1 b 1 b 1 2 b 6 b 1 3 a 2 a 0 4 a 4 a 0 5 a 5 a 0
⚠️默认how="inner"即内连接,所以df3中的c和df4中的d行没有选中。how的参数有:left, right, outer, inner。
上面两个例子,表的行关系是:多对1。如果是多对多,则发生笛卡尔积运算。
要根据多个键进行合并,传入一个由列名组成的列表即可:
right = pd.DataFrame({'key1': ['foo', 'foo', 'bar', 'bar'], 'key2': ['one', 'one', 'one', 'two'], 'rval': [4, 5, 6, 7]}) left = pd.DataFrame({'key1': ['foo', 'foo', 'bar'], 'key2': ['one', 'two', 'one'], 'lval': [1, 2, 3]}) pd.merge(left, right, on=['key1', 'key2'])
merge函数自带的参数suffixes,可以自动处理重复的列名。也可以自定义后缀suffixes=('_left', '_r ight'))