12. Pandas 数据合并与拼接(concat 与 merge)
Pandas 数据合并与拼接(concat 与 merge)
在数据分析中,常常需要将来自不同来源或不同维度的数据整合在一起。Pandas 提供了两种强大的数据合并工具:concat
和 merge
。前者更适合在行或列方向上拼接 DataFrame,而后者则更接近 SQL 的表连接操作,支持多键匹配与多种连接方式。掌握它们的使用方法,是进行数据清洗与整合分析的关键步骤。
1. 使用 concat 拼接数据
concat
用于沿指定轴将多个 DataFrame 拼接起来。默认按行(axis=0)拼接,也可以按列(axis=1)拼接。
import pandas as pddf1 = pd.DataFrame({"姓名": ["张三", "李四"],"城市": ["北京", "上海"]
})df2 = pd.DataFrame({"姓名": ["王五", "赵六"],"城市": ["广州", "深圳"]
})
1.1 行拼接
当两个 DataFrame 拥有相同的列结构时,可以直接按行堆叠:
# 行拼接
df_row = pd.concat([df1, df2], axis=0)
print("按行拼接:\n", df_row)
按行拼接:姓名 城市
0 张三 北京
1 李四 上海
0 王五 广州
1 赵六 深圳
1.2 列拼接
如果要将不同列的数据拼在一起(例如补充信息列),可以按列方向拼接:
df3 = pd.DataFrame({"销售额": [100, 150],"年龄": [23, 34]
})# 按列拼接
df_col = pd.concat([df1, df3], axis=1)
print("按列拼接:\n", df_col)
按列拼接:姓名 城市 销售额 年龄
0 张三 北京 100 23
1 李四 上海 150 34
1.3 重置索引
默认会保留原索引,如果希望生成新的连续索引,可以设置 ignore_index=True
:
df_row_reset = pd.concat([df1, df2], axis=0, ignore_index=True)
print("重置索引:\n", df_row_reset)
重置索引:姓名 城市
0 张三 北京
1 李四 上海
2 王五 广州
3 赵六 深圳
2. 使用 merge 合并表
merge
的功能更强大,类似于 SQL 的 JOIN
操作。它允许根据一个或多个键,将不同表的数据进行行级匹配。下面通过示例展示几种常见的连接方式。
df_left = pd.DataFrame({"姓名": ["张三", "李四", "王五"],"城市": ["北京", "上海", "广州"]
})df_right = pd.DataFrame({"姓名": ["张三", "李四", "赵六"],"销售额": [100, 150, 130]
})
2.1 内连接(默认)
默认方式为内连接,即仅保留两表中键值同时存在的行:
df_inner = pd.merge(df_left, df_right, on="姓名", how="inner")
print("内连接:\n", df_inner)
内连接:姓名 城市 销售额
0 张三 北京 100
1 李四 上海 150
2.2 外连接
外连接会保留两表的所有行,缺失部分用 NaN
填充:
df_outer = pd.merge(df_left, df_right, on="姓名", how="outer")
print("外连接:\n", df_outer)
外连接:姓名 城市 销售额
0 张三 北京 100.0
1 李四 上海 150.0
2 王五 广州 NaN
3 赵六 NaN 130.0
2.3 左连接与右连接
左连接保留左表的全部行,右连接则保留右表的全部行。两者在实际数据对齐场景中十分常见。
# 左连接
df_left_join = pd.merge(df_left, df_right, on="姓名", how="left")# 右连接
df_right_join = pd.merge(df_left, df_right, on="姓名", how="right")print("左连接:\n", df_left_join)print("\n右连接\n", df_right_join)
左连接:姓名 城市 销售额
0 张三 北京 100.0
1 李四 上海 150.0
2 王五 广州 NaN右连接姓名 城市 销售额
0 张三 北京 100
1 李四 上海 150
2 赵六 NaN 130
3. 多键合并
当匹配条件涉及多个字段时,可以将 on
参数设置为列名列表。例如同时按“姓名”和“城市”进行匹配:
df_left_multi = pd.DataFrame({"姓名": ["张三", "李四", "王五"],"城市": ["北京", "上海", "广州"],"部门": ["A", "B", "A"]
})df_right_multi = pd.DataFrame({"姓名": ["张三", "李四", "王五"],"城市": ["北京", "上海", "北京"],"销售额": [100, 150, 200]
})df_multi_merge = pd.merge(df_left_multi, df_right_multi, on=["姓名", "城市"], how="inner")
print("多键合并:\n", df_multi_merge)
多键合并:姓名 城市 部门 销售额
0 张三 北京 A 100
1 李四 上海 B 150
在数据清洗与报表整合中,多键合并常用于确保匹配条件更精确,避免仅凭单字段造成误合。
4. 小结
在 Pandas 中,concat
更适合做结构相同数据的简单拼接,无论是行方向堆叠还是列方向扩展,都能快速实现。而 merge
则提供了灵活的按键合并机制,可以实现类似 SQL 的多表关联,是构建复杂数据关系的核心工具。
掌握它们的使用规律与差异,能够让你在数据整合、分析建模及报表生成中更加得心应手。