1. concate
df = pandas.concat(objs, axis=0, join='outer', ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
sort=None, copy=True)
"""
(1)objs:对象,一般为df或者series
(2)axis:拼接方向,默认为0,行拼接,若axis=1,则为列拼接
(3)join:默认为outer表示并集,inner表示交集, left/right表示左右连接
(4)ignore_index=True:重建索引
(5)keys:创建层次化索引
"""
(1)两张表列数一致,只是需要将行数简单拼接时:pd.concat([df1,df2]),
效果df1.append(df2)。
(2)两张表行数一致,只需要列简单拼接时:pd.concate([df1,df2],axis=1),
效果pd.merge(df1,df2,left_index=True,right_index=True,how=‘outer’)。
(3)两张表按行拼接,只想保留列索引相同的列,则how=‘inner’。
(4)两张表按列拼接,只想保留行索引相同的行,则how=‘inner’。
2. merge
df =DataFrame.merge(left, right, how='inner', on=None,
left_on=None, right_on=None, left_index=False,
right_index=False, sort=False, suffixes=('_x', '_y'),
copy=True, indicator=False, validate=None)
# innner: 默认的连接方式,共同的列必须完全相等
# left: 根据左边的dataframe确定共同列的保留值,右边缺失列的值赋为NaN
# right: 根据右边的dataframe确定共同列的保留值,左边缺失列的值赋为NaN
# 多列合并
result = pd.merge(df1, df2, on=['B', 'C'], how='inner')
# 采用left_on 和 right_on对两个列名不同的dataframe合并
result = pd.merge(df1, df2, left_on='A', right_on='D', how='inner')
# 采用suffixes属性为合并的两个dataframe的相同的列设置合并后相同列名的后缀
result = pd.merge(df1, df2, on='B', how='outer', suffixes=('_df1', '_df2'))
(1)merge只能用于两张表的连接,若有多个,则需不断两两合并实现。
(2)两张表有相同内容的一列,根据这一列将两张表进行合并,合并表的列数等于两张数据表列数和减去连接键的数量
#样集1
df1=pd.DataFrame(np.arange(12).reshape(3,4),columns=['a','b','c','d'])
>>> df1
a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
#样集2
df2=pd.DataFrame({'b':[1,5],'d':[3,7],'a':[0,4]})
>>> df2
b d a
0 1 3 0
1 5 7 4
#两张表df1和df2的列名有重叠,且重叠列的内容完全相同,直接用pd.merge(df1, df2)
pd.merge(df1,df2)
>>>
a b c d
0 0 1 2 3
1 4 5 6 7
3. join
df =DataFrame.join(other, on=None, how='left',
lsuffix=' ', rsuffix=' ', sort=False)
#样集1
left=pd.DataFrame({'key':['foo','bar1'],'lval':[1,2]})
>>>
key lval
0 foo 1
1 bar1 2
#样集2
right=pd.DataFrame({'key':['foo','bar'],'rval':[4,5]})
>>>
key rval
0 foo 4
1 bar 5
#列名和列内容均部分相同的表df1和df2进行基于列索引,列拼接
left.join(right.set_index('key'),on='key')
>>>
key lval rval
0 foo 1 4.0
1 bar1 2 NaN
#样集3
left=pd.DataFrame({'key':['foo','bar1'],'val':[1,2]})
>>>
key val
0 foo 1
1 bar1 2
#样集4
right=pd.DataFrame({'key':['foo','bar'],'val':[4,5]})
>>>
key val
0 foo 4
1 bar 5
#列名相同,列内容部分相同的表df1和df2基于列索引进行列合并,必须用参数lsuffix='_l',rsuffix='_r'指定重名列的下标,否则报错
left.join(right.set_index('key'),on='key',lsuffix='_l',rsuffix='_r')
>>>
key val_l val_r
0 foo 1 4.0
1 bar1 2 NaN
#特别注意,即使列名相同了,也必须用到' set_index(key)' 否则直接使用
left.join(right,on='key',lsuffix='_l',rsuffix='_r')
>>> ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat
#另外需明确,不指定'ON= '参数的情况下,JOIN是按行索引进行列拼接,不对列进行任何操作。
left.join(right,lsuffix='_l',rsuffix='_r')
(1)无重复列名的两个表基于行索引进行拼接,直接使用df1.join(df2),合并后的行数与df1相同,合并后的列数为df1+df2之和。
4. 总结
(1) 简单粗暴拼接用concate
(2)复杂拼接用merge
参考:
https://www.cnblogs.com/guxh/p/9451532.html