【Pd-07】pandas数据拼接合并concat,merge,join
| 函数 | 使用场景 | 调用方法 | 备注 |
|---|---|---|---|
| concat | 用于2个及以上df的行或列方向进行内联或外联,默认行拼接,取并集,一般是行的纵深方向合并 | res = pd.concat([df1, df2], axis=1) | axis设置方向 |
| merge | 用于2个及以上df的行或列方向进行内联或外联,默认列拼接,取交集,一般是横向扩展 | res = pd.merge([df1, df2], how="left") | 类似SQL数据库,有左联,右联,内联和外联 |
| join | 用于列方向的拼接,默认左列拼接,how="left" | df1.join(df2) | 左联,右联,内联和外联 |
| append | df行方向的拼接 | df1.append(df2) | 纵深方向合并 |
说明 :重点掌握concat和merge即可,大部分情况下都可以使用这两个完成,concat在纵深方向,merge在横向扩展上。join是类似于merge,append是类似于concat。
1、concat
#数据构造
df1 = pd.DataFrame({
"aa":['a1','a2','a3','a4'],
"bb":['b1','b2','b3','b4'],
"cc":['c1','c2','c3','c4'],
"dd":['d1','d2','d3','d4'],
df2= pd.DataFrame({
"aa":['a5','a6','a7','a8'],
"bb":['b5','b6','b7','b8'],
"ee":['e5','e6','e7','e8'],
"ff":['f5','f6','f7','f8'],
)
1.1 语法格式
pandas.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)
1.2 参数说明
- objs:series,dataframe或者是panel对象构成的序列lsit
- axis:指明连接的轴向, {0/’index’(行), 1/’columns’(列)}, 默认为0
- join:指明连接方式 , {‘inner’(交集), ‘outer(并集)’}, 默认为outer
- join_axes:自定义的索引。指明用其他n-1条轴的索引进行拼接, 而非默认join =’ inner’或’outer’方式拼接
- keys:创建层次化索引。可以是任意值的列表或数组、元组数组、数组列表(如果将levels设置成多级数组的话)
- ignore_index=True:重建索引
1.3 核心功能
两个DataFrame通过pd.concat(),既可实现行拼接又可实现列拼接,默认 axis=0,join='outer' 。表df1和df2的行索引(index)和列索引(columns)均可以重复。
1、设置join='outer',只是沿着一条轴,单纯将多个对象拼接到一起,类似数据库中的全连接(union all)。
a. 当axis=0(行拼接)时,使用pd.concat([df1,df2]),拼接表的index=index(df1) + index(df2),拼接表的columns=columns(df1) ∪ columns(df2),缺失值填充NaN。 等价于 :df1.append(df2)
b. 当axis=1(列拼接)时,使用pd.concat([df1,df2],axis=1),拼接表的index=index(df1) ∪ index(df2),拼接表的columns=columns(df1) + columns(df2),缺失值填充NaN。 类似与:pd.merge(obj1, obj2, left_index=True, right_index=True, how='outer')
2、设置join='inner',拼接方式为“交联”,即:行拼接时,仅保留df1和df2列索引重复的列;列拼接时,仅保留df1和df2行索引重复的行。
a. 当axis=0(行拼接)时,使用pd.concat([df1,df4],join='inner'),拼接表的index=index(df1) + index(df2),拼接表的columns=columns(df1) ∩ columns(df2);
b. 当axis=1(列拼接)时,pd.concat([df1,df4],axis=1,join='inner'),拼接表的index=index(df1) ∩ index(df2),拼接表的columns=columns(df1) + columns(df2);
1.4 其他的参数
- ignore_index=True可以忽略原来的索引
- 添加一列Series,也可以添加多列Series
- keys参数作用:可以用来给合并后的表增加key来区分不同的表数据来源
1.5 常见的一个报错信息
TypeError: first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"
出错原因就是,在使用pandas.concat (a,b) 进行合并的时候,需要是list的形式。因此改成pandas.concat( [a,b] ),就可以成功合并。
2、merge
数据构造
df1 = pd.DataFrame({
"aa":['a1','a1','a2','a3'],
"bb":['b1','b2','b2','b4'],
"cc":['c1','c2','c3','c4'],
"dd":['d1','d2','d3','d4'],
df2= pd.DataFrame({
"aa":['a1','a1','a3','a4'],
"bb":['b1','b2','b3','b4'],
"ee":['e5','e6','e7','e8'],
"ff":['f5','f6','f7','f8'],