行者孙Python

择洗篇-Day15|合料拼盘:concat 合并、merge 连接多份数据

📖 知识点

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 像 "把每道菜的价签和销量贴在同一张菜卡上"(字段变全)。

⚠️ 易错提醒

  1. concat 拼接的表列结构要一致,否则会错位
  2. merge 要用 on= 指定共同的连接列,且两表都有该列
  3. merge 默认 "内连接"(只留两表都有的键),想留全部用 how="outer"

⚔️ Kata 实战任务

任务需求:

  1. 导入 pandas,创建两份 "价格" 表(不同菜名)
  2. 用 concat 把两份价格表上下拼接
  3. 再创建一份 "销量" 表(含菜名、销量)
  4. 用 merge 按 "菜名" 把价格表和销量表对接成一张宽表
  5. 打印拼接和对接的结果

参考代码

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 再按 "菜名" 把销量对接进来,得到 "菜名 + 价格 + 销量" 的完整宽表。

🧠 思考题

  1. concat 和 merge 合并数据的方式有什么本质区别?分别解决什么问题?
  2. merge 时如果某菜只在价格表、不在销量表,on="菜名" 默认(内连接)会怎么处理?
‹ 返回目录
🏠首页 Python 📦资源 👤关于我