可参考pd.merge
python中多表拼接简要概括(参考张俊红的书《对比excel学python数据分析》),以便自我查阅:
merge() 主要用于多表横向拼接
concat() 主要用于纵向拼接
1,merge()横向拼接
(一)当能够找到公共列(两表中该列内容完全一样):
(1)默认会自动寻找两个表的公共列
(2)用on指定连接键,一般指定的也是两个表的公共列,on可以指定一个或多个连接键
如pd.merge(df1,df2,on=‘学号’)
或者pd.merge(df1,df2,on=[‘姓名’,‘学号’])
(3)分别指定左右连接键:当两表没有公共列(此处指实际值一样,但列名不同,如‘编号’和‘学号’,实际值都是学号),用left_on和right_on分别指定左表和右表用作连接键的列名,本质上还是自动寻找两个表的公共列
(4)把索引列当作连接键(两表的公共列是索引列):left_index=True, right_index=True
或者left_index=True, right_on=‘学号’,表示左表连接键作为索引、右边连接键作为普通列
(二)当两表找不到完全一致的公共列(如df1中‘姓名’列包含‘小张’、‘小王’,df2中‘姓名’列包含‘小张’、‘小李’),采用how参数指明连接方式
(1)内连接(how=‘inner’),两表做交集,采用公共部分
(2)左连接(how=‘left’),以左表为基础,右表往左表上拼接(左表全保留,右表根据左表增删,左表中有、右表没有的部分,拼接过来用NaN填充)
(3)右连接(how=‘right’),以右表为基础,其他同上
(4)外连接(how=‘outer’),两表做并集,缺失的部分用NaN填补
注:非连接列出现重复列名时,merge()会自动添加后缀_x,_y,_z等,可通过suffixes=[’_L’,’_R’]等方式修改
2,concat()纵向拼接,一般是若干个数据结构相同的表格进行垂直方向拼接
pd.concat([df1,df2])
(1)默认保留原表索引,如df1和df2索引都为1234,则concat后索引为12341234
ignore_index=True,不保留原索引,重新生成一组索引01234567
(2) 重复值处理,若df1中‘姓名’列有‘小张’、‘小李’,df2的‘姓名’列有‘小王’、‘小李’,pd.concat(df1,df2)之后‘小李’出现两次,采用drop_duplicates()删除重复值
如pd.concat([df1,df1],ignore_index=True).drop_duplicates()
3,关于join()功能类似于merge(),用于横向拼接
区别在于join只有一种连接键(索引作为连接键),而merge()有多种连接方式
df1.join(df2) ,df1和df2索引一致
若df1和df2索引不一致但有公共列(列名为‘ID’),则可先将公共列设为索引,再join,如:
df=df1.set_index(‘ID’).join(df2.set_index(‘ID’))
参考/questions/22676081/what-is-the-difference-between-join-and-merge-in-pandas
‘the related DataFrame.join method, uses merge internally for the
index-on-index and index-on-column(s) joins, but joins on indexes by
default rather than trying to join on common columns (the default
behavior for merge). If you are joining on index, you may wish to
use DataFrame.join to save yourself some typing.’