当我们有多个数据文件,每个文件都读取为一个单独的 DataFrame 时,需要合并这些 DataFrame 时,就需要使用 concat() 方法。
这是 pandas 快速上手系列的第 4 篇文章,本篇详细介绍了 concat 的使用和示例。pandas中的 concat() 方法用于将两个或多个 DataFrame 对象沿着行 axis=0 或者列 axis=1 的方向拼接在一起,生成一个新的DataFrame对象。
语法:
pandas.concat(objs, axis=0, join='outer', ignore_index=False, keys=None,
levels=None, names=None, verify_integrity=False, sort=False,
copy=True)
参数说明:
objs: 是一个序列或 Series/DataFrame 的字典,即需要合并的数据对象
axis: 指定合并的轴向,axis=0 是纵向合并(增加行数), axis=1 是横向合并(增加列数)
join: 连接方式,有 inner (相交部分)和 outer (并集部分)
ignore_index: 设置为 True 时,合并后的数据索引将重新排序
keys: 用于构造合并后层次化的索引,可以给每个数据源命名
纵向合并两个DataFrame,设置 axis=0
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
res = pd.concat([df1, df2], axis=0, ignore_index=True)
print(res)
输出:
A B
0 1 3
1 2 4
2 5 7
3 6 8
横向合并两个DataFrame,设置 axis=1
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'C': [5, 6], 'D': [7, 8]})
res = pd.concat([df1, df2], axis=1)
print(res)
输出:
A B C D
0 1 3 5 7
1 2 4 6 8
join='inner'表示取两个 DataFrame 的行列索引的交集进行拼接
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}, index=[1, 2])
df2 = pd.DataFrame({'C': [5, 6], 'D': [7, 8]}, index=[2, 3])
# 横向合并,取交集行索引是2的部分
res = pd.concat([df1, df2], axis=1, join='inner')
print(res)
输出:
A B C D
2 2 4 5 7
可以看到,最终结果只保留了两个 DataFrame 行索引的交集部分,即索引为2这一行。
join='outer'表示取两个 DataFrame 的行列索引的并集进行拼接,缺失值为NaN
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}, index=[1, 2])
df2 = pd.DataFrame({'C': [5, 6], 'D': [7, 8]}, index=[2, 3])
# 横向合并,并集拼接
res = pd.concat([df1, df2], axis=1, join='outer')
print(res)
输出:
A B C D
1 1.0 3.0 NaN NaN
2 2.0 4.0 5.0 7.0
3 NaN NaN 6.0 8.0
可以看到,最终结果保留了两个 DataFrame 行索引的并集,缺失值用 NaN 填充。join='inner' 表示取索引交集,join='outer' 表示取并集。在实际工作中,我们可以根据具体需求选择合适的连接方式。一般来说,如果希望保留两个数据源中所有数据就用 outer ,如果只需要保留两者公共部分就用 inner 。
给数据源命名并层次化索引
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2]})
df2 = pd.DataFrame({'B': [3, 4]})
# keys 的长度必须和df中的列名的长度一样
res = pd.concat([df1, df2], axis=1, keys=['X', 'Y'])
print(res)
输出:
X Y
A B
0 1 3
1 2 4
当使用 pd.concat() 合并多个 DataFrame 时,如果不指定 keys 参数,合并后的 DataFrame 的索引默认就是按顺序的范围索引(range index)或原始的索引。
但有时我们想要在合并后的结果中区分出不同 DataFrame 的来源,从而构造一个多层级索引(hierarchical index),这时就需要用到 keys 参数了。
keys 允许我们为每个被合并的 DataFrame 指定一个标记名称,这个标记将作为最外层级索引。
上面就是将 X, Y 设置了多层级索引
In [19]: res = pd.concat([df1, df2], axis=1, keys=['X', 'Z'])
In [20]: res
Out[20]:
X Z
A B
0 1 3
1 2 4
In [21]: res['X']
Out[21]:
A
0 1
1 2
本文分享自 pythonista的日常 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!