📖 知识点
1. concat ():上下拼接(堆叠)
把多张结构相同的表 "竖着摞起来":
import pandas as pd
df1 = pd.DataFrame({"菜名": ["白菜", "番茄"], "价格": [3, 5]})
df2 = pd.DataFrame({"菜名": ["土豆", "黄瓜"], "价格": [2, 4]})
# 上下拼接成一张大表
df_all = pd.concat([df1, df2])
print(df_all)
运行输出:
菜名 价格
0 白菜 3
1 番茄 5
0 土豆 2
1 黄瓜 4
concat([表1, 表2])把两张表按行拼在一起(列一致才合理)。
2. merge ():按关键列连接(对接)
把两张表按共同的 "键"(如菜名)对接成一张宽表,类似 Excel 的 VLOOKUP:
df_price = pd.DataFrame({"菜名": ["白菜","番茄"], "价格": [3,5]})
df_sale = pd.DataFrame({"菜名": ["白菜","番茄"], "销量": [10,20]})
# 按"菜名"对接
df_merged = pd.merge(df_price, df_sale, on="菜名")
print(df_merged)
运行输出:
菜名 价格 销量
0 白菜 3 10
1 番茄 5 20
merge(表1, 表2, on="菜名")把 "价格" 和 "销量" 按菜名合并到一行,一张表包含全部字段。
3. 两者区别
| 方法 | 拼接方向 | 适用场景 |
|---|---|---|
concat | 上下堆叠行 | 多份同结构数据合在一起 |
merge | 按关键列对接 | 不同字段的表按某列连成宽表 |
💡 生活比喻 concat 像 "把两摞盘子摞成一摞"(行变多);merge 像 "把每道菜的价签和销量贴在同一张菜卡上"(字段变全)。
⚠️ 易错提醒
concat拼接的表列结构要一致,否则会错位merge要用on=指定共同的连接列,且两表都有该列merge默认 "内连接"(只留两表都有的键),想留全部用how="outer"
⚔️ Kata 实战任务
任务需求:
- 导入 pandas,创建两份 "价格" 表(不同菜名)
- 用
concat把两份价格表上下拼接 - 再创建一份 "销量" 表(含菜名、销量)
- 用
merge按 "菜名" 把价格表和销量表对接成一张宽表 - 打印拼接和对接的结果
参考代码
import pandas as pd
# 两份价格表
df1 = pd.DataFrame({"菜名": ["白菜", "番茄"], "价格": [3, 5]})
df2 = pd.DataFrame({"菜名": ["土豆", "黄瓜"], "价格": [2, 4]})
# concat:上下拼接
df_price_all = pd.concat([df1, df2])
print("===== concat 拼接的价格表 =====")
print(df_price_all)
# 销量表
df_sale = pd.DataFrame({"菜名": ["白菜", "番茄", "土豆", "黄瓜"], "销量": [10, 20, 30, 15]})
# merge:按菜名对接
df_full = pd.merge(df_price_all, df_sale, on="菜名")
print("\n===== merge 对接后的完整表 =====")
print(df_full)
运行输出:
===== concat 拼接的价格表 =====
菜名 价格
0 白菜 3
1 番茄 5
0 土豆 2
1 黄瓜 4
===== merge 对接后的完整表 =====
菜名 价格 销量
0 白菜 3 10
1 番茄 5 20
2 土豆 2 30
3 黄瓜 4 15
💡 观察:concat 把 4 种菜的价格拼成一张表;merge 再按 "菜名" 把销量对接进来,得到 "菜名 + 价格 + 销量" 的完整宽表。
🧠 思考题
concat和merge合并数据的方式有什么本质区别?分别解决什么问题?merge时如果某菜只在价格表、不在销量表,on="菜名"默认(内连接)会怎么处理?