参考博客:https://blog.youkuaiyun.com/guofei_fly/article/details/85455813
说明:
行方向连接,也称纵向连接,增加行,此时axis = 0或 axis = ‘index’;
列方向连接,也称横向连接,增加列,此时axis = 1或 axis = ‘column’。
方法 | 简介 | 调用方法 |
---|---|---|
concat() | 提供行方向和列方向进行内联或外联的拼接操作 | pd.concat([df1, df2]) |
merge() | 提供类似于SQL数据库中的join连接功能,支持左联、右联、内联和外联等全部四种SQL连接操作类型 | pd.merge(df1,df2) 或 df1.merge(df2) |
append() | 提供行方向的拼接操作 | df1.append() |
join() | 提供列方向的拼接操作,支持左联、右联、内联和外联四种操作类型 | df1.join() |
1. concat方法
concat方法与SQL中的join不同,当axis = 0时,concat会保留所有行(可能丢失部分列);当axis = 1时,concat会保留所有列(可能会丢失部分行)。
而SQL中的join方法一般会指定on a.id = b.id等条件,筛选出来部分行。
concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
sort=None, copy=True)
参数列表:
axis
axis = 0:即axis = ‘index’,进行纵向连接(根据列名),增加行;
最后的行数一定等于几个子df的行数和;
axis = 1:即axis = ‘columns’,进行横向连接(根据索引标签),增加列;
最后的列数一定等于几个子df的列数和;
join
join=‘outer’:当axis = 0时,列名相同的列会合并,其余列都保留,空值填充;
join=‘inner’:当axis = 0时,列名相同的列会合并,其余列都舍弃.
ignore_index
ignore_index=True:当axis = 0时,为True表示对行index重新编号。设为False有可能出现同名的行。
join_axes
自定义合并的轴。(既不用outer也不用inner)
1.1 测试参数axis、join和ignore_index
df1 = pd.DataFrame(np.ones((3, 4)) * 0, columns=['id', 'name', 'class', 'score'],index=[0,1,2])
df2 = pd.DataFrame(np.ones((3, 4)) * 22, columns=['id', 'name', 'sex', 'address'],index=[2,3,4])
print(df1)
print(df2)
################# (axis='index', join='outer) ################
# axis='index': 纵连接(根据列名),增加行;
# 最后行数 = 两个表行数之和
# join='outer':列名相同的列会合并,其余列都保留,空值填充;
# 最后列数 = 两个表列数和 - 列名相同的列数
# ignore_index=True:对行索引重新编号,原索引会清除。设为False有可能出现同索引的行
print("-------------------- test 1 ---------------------")
res = pd.concat([df1, df2], axis='index', join='outer', ignore_index=True)
print(res)
################# (axis='index', join='inner) ################
# axis='index': 纵连接(根据列名),增加行;
# 最后行数 = 两个表行数之和;
# join='inner',列名相同的列会合并,其余列都舍弃;
# 最后列数 = 两个表中列名相同的列数;
print("-------------------- test 2 ---------------------")
res = pd.concat([df1, df2], axis='index', join='inner', ignore_index=True)
print(res)
################# (axis='columns', join='outer) ################
# axis='columns':进行横向连接(根据行的index标签),增加列;
# 最后列数 = 两个表列数和
# join='outer':index标签相同的行会合并,其余列都保留,空值填充.
# 最后行数 = 两个表行数和 - 列名相同的列数
# ignore_index=True:对列名重新编号,原列名会清除。设为False有可能出现同名的列
print("-------------------- test 3 ---------------------")
res = pd.concat([df1, df2], axis='columns', join='outer', ignore_index=True)
print(res)
################# (axis='columns', join='inner) ################
# axis='columns':进行横向连接(根据行的index标签),增加列;
# 最后列数 = 两个表列数和;
# join='inner': index标签相同的行会合并,其余列都舍弃;
# 最后行数 = 两个表列名相同的列数;
# ignore_index=True: 对列名重新编号;
print("-------------------- test 4 ---------------------")
res = pd.concat([df1, df2], axis='columns', join='outer', ignore_index=True)
print(res)
运行结果:
id name class score
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0