pandas中的concat的功能:
假设你现在需要将多个数据合并,前提是:这几个文件列名都一致,也就是说这几个文件格式完全一样,只是数据不太一样,类似于合并多个文件这种,实际数据分析中也会遇到这种情况,那该怎么做呢?(可能也会遇到格式不一样的情况,当然也是可以合并的正文也会讲解)下面来一起学习下在pandas中如何快速合并文件:
主要分为两种情况
纵向合并:
需要注意的是,axis=0也就是默认值的时候,合并的时候是按照两个数据的列名称作为键来和合并的。
s1 = pd.Series(['a', 'b'])s2 = pd.Series(['c', 'd'])pd.concat([s1, s2])
横向合并:(axis=1,)
类似于merge,但是和merge也不一样,如果设置axis=1合并的时候是按照索引来合并的,merge可以设置左右两个数据的合并键,这点要区分。
result = pd.concat([df1, df4], axis=1)
需要重点掌握的概念:
- concat和merge不一样,虽然都是合并,但是merge更多的是数据匹配,根据共同的键来匹配,和sql中的查询很类似,和excel中的vlookup很像,而concat是数据合并,不需要设置合并的键,
- 合并的keys:axis=0是按照列名,axis=1是按照索引来合并
- concat的概念不仅存在于数据合并,在数据分组groupby中也隐藏着它的踪迹,先分组,每个分组统计,然后合并,其意义与我们合并数据是一样的
- 当axis=1的时候也就是横向合并,它的意义和merge很类似,需要好好区分
通过上面两个简单的例子,应该能初步认识concat
下面通过实例完整的掌握这个知识点:
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
copy=True)
最简单的纵向合并(有人也叫轴向合并,但是我总分不清楚,就叫它纵向合并吧)
import pandas as pdone = pd.DataFrame({ 'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'], 'subject_id':['sub1','sub2','sub4','sub6','sub5'], 'Marks_scored':[98,90,87,69,78]}, index=[1,2,3,4,5])two = pd.DataFrame({ 'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 'subject_id':['sub2','sub4','sub3','sub6','sub5'], 'Marks_scored':[89,80,79,97,88]}, index=[1,2,3,4,5])rs = pd.concat([one,two])print(rs)
结果:
objs︰ 传入一个需要合并的序列
axis: {0,1,...},默认值为 0。要连接沿轴。
ignore_index︰ 布尔值、 默认 False。这个参数很重要,纵向合并多个文件时,默认为原来的索引,这样势必导致会有重复的索引值,如果想要一个全新的索引,就设置这个参数为True
在没有设置这个参数的时候可以看到结果中的索引均为各自原先的索引,下面看看设置后的:
rs = pd.concat([one,two],ignore_index=True)
结果:
keys︰ 序列,默认为无。构建分层索引使用通过的键作为最外面的级别。如果多个级别获得通过,应包含元组。
如果你写成下面这种方式,keys的结果会被ignore覆盖掉
rs = pd.concat([one,two],ignore_index=True,keys=["a