最新消息:

pandas中对DataFrame进行合并和拼接

IT技术 ipcpu 207浏览 0评论

pandas中对DataFrame进行合并和拼接.md

pandas中对DataFrame进行合并和拼接主要有3中方法,分别是merge()函数、concat()函数、append()函数,其中merge()函数用得较多。下面通过一个简单的例子演示这3个函数的用法。

一、数据准备

我们准备了两个DataFrame数据表,如下

二、merge()函数

merge()函数可以根据一个或多个同名的列将不同数据表中的行连接起来,演示代码如下:

df3 = pd.merge(df1, df2)

运行后df3的内容见下表。

可以看到,merge()函数直接根据相同的列名(“公司”列)对两个数据表进行了合并,而且默认选取的是两个表共有的列内容(’恒盛’、’创锐’)。如果同名的列不止一个,可以通过设置参数on指定按照哪一列进行合并,代码如下:

df3 = pd.merge(df1, df2, on='公司')

默认的合并方式其实是取交集(inner连接),即选取两个表共有的内容。如果想取并集(outer连接),即选取两个表所有的内容,可以设置参数how,代码如下:

1 df3 = pd.merge(df1, df2, how='outer')

运行后df3的内容见下表,可以看到所有数据都在,原来没有的内容则用空值NaN填充。

如果想保留左表(df1)的全部内容,而对右表(df2)不太在意,可以将参数how设置为’left’,代码如下:

df3 = pd.merge(df1, df2, how='left')

此时df3的内容见下表,完整保留了df1的内容(’恒盛’、’创锐’、’快学’)。

同理,如果想保留右表(df2)的全部内容,而不太在意左表(df1),可以将参数how设置为’right’。

如果想按照行索引进行合并,可以设置参数left_index和right_index,代码如下:

df3 = pd.merge(df1, df2, left_index=True, right_index=True)

此时df3的内容见下表,两个表按照它们的行索引进行了合并。

三、concat()函数

concat()函数使用全连接(UNION ALL)方式完成拼接,它不需要对齐,而是直接进行合并,即不需要两个表有相同的列或索引,只是把数据整合到一起。因此,该函数没有参数how和on,而是用参数axis指定连接的轴向。该参数默认值为0,指按行方向连接(纵向拼接)。代码如下:

df3 = pd.concat([df1, df2])  
# 或者写成df3 = pd.concat([df1, df2], axis=0)

此时df3的内容见下表。

此时的行索引为原来两个表各自的索引,如果想重置索引,可以使用3.5.1节讲过的reset_index()函数,或者在concat()函数中设置参数ignore_index为True来忽略原有索引,生成新的数字序列作为索引,代码如下:

df3 = pd.concat([df1, df2], ignore_index=True)

如果想按列方向连接,即横向拼接,可以设置参数axis为1。代码如下:

df3 = pd.concat([df1, df2], axis=1)

此时df3的内容见下表。

四、append()函数

append()函数可以看成concat()函数的简化版,效果和pd.concat([df1,df2])类似,实现的也是纵向拼接,代码如下:

df3 = df1.append(df2)

append()函数还有一个和列表的append()函数一样的用途——新增元素,代码如下:

df3 = df1.append({'公司': '腾飞', '分数': '90'}, ignore_index=True)

这里一定要设置参数ignore_index为True来忽略原索引,否则会报错。生成的df3的内容见下表。

五、总结

merge()函数最常用,主要用于基于指定列的横向合并
concat()函数一般用来无脑横向和纵向拼接
append()函数实现无脑纵向拼接,也用于新增一行数据
由此我们可以看出,concat()和append()函数都是无脑硬拼,不关心数据是否对应;只有merge()函数才有参数控制和并方式。

六、参考资料

https://bigdata.51cto.com/art/202007/620338.htm
https://zhuanlan.zhihu.com/p/69224745
《超简单:用Python让Excel飞起来》机械工业出版社,3.5.4章

转载请注明:IPCPU-网络之路 » pandas中对DataFrame进行合并和拼接

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. pd.merge(df1, df2, left_index=True, right_index=True) #根据index值相同做合并,默认是leftjoin,可根据需要制定how方式
    ipcpu2个月前 (08-31)Reply