高级合并与连接
使用 how、on、left_on/right_on 和 suffixes 配置 pd.merge(),并使用 merge_asof 进行基于时间的连接
高级合并与连接 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
合并 DataFrames
pd.merge 根据共享键连接两个 DataFrames, בדיוק כמו SQL JOIN。掌握 how 选项对于处理关系型数据至关重要。
import pandas as pd
left = pd.DataFrame({"id": [1, 2, 3], "name": ["a", "b", "c"]})
right = pd.DataFrame({"id": [2, 3, 4], "score": [90, 80, 70]})内连接(默认)
how="inner" 只保留两个数据框中都存在的键,即 BOTH 键。这是默认选项。
print(pd.merge(left, right, on="id", how="inner"))
# id name score
# 0 2 b 90
# 1 3 c 80左连接
how="left" 会保留左侧数据框中的每一行;右侧不匹配的列会变成 NaN。这是分析中最常见的连接方式。
print(pd.merge(left, right, on="id", how="left"))
# id name score
# 0 1 a NaN
# 1 2 b 90.0
# 2 3 c 80.0外连接
how="outer" 会保留两侧的所有键,并使用 NaN 填充缺口。请使用它查看记录的完整并集。
print(pd.merge(left, right, on="id", how="outer"))
# includes id 1 (no score) and id 4 (no name)连接名称不同的列
当键列的名称不同时,请使用 left_on 和 right_on,而不是 on。
r2 = right.rename(columns={"id": "user_id"})
print(pd.merge(left, r2, left_on="id", right_on="user_id"))重叠列的后缀
如果两个数据框共享一个非键列名称,该库会追加 _x 和 _y。请使用 suffixes 覆盖默认后缀,以提高可读性。
a = pd.DataFrame({"id": [1], "val": [10]})
b2 = pd.DataFrame({"id": [1], "val": [99]})
print(pd.merge(a, b2, on="id", suffixes=("_old", "_new")))indicator 列
indicator=True 会添加一个 _merge 列,显示每行的来源:仅左侧、仅右侧或两侧。它对于审计连接结果非常有用。
print(pd.merge(left, right, on="id", how="outer", indicator=True))
# _merge tells you where each row came from诊断连接问题
根据 indicator 进行筛选,可以快速发现未匹配的键;未匹配的键是数据悄然丢失的常见原因。
m = pd.merge(left, right, on="id", how="outer", indicator=True)
print(m[m["_merge"] != "both"]) # rows that did not match用于时间连接的 merge_asof
pd.merge_asof 按 NEAREST 键进行连接,而不是要求精确匹配。它专为对齐时间序列而设计,例如将每笔交易匹配到此前最近的报价。两个数据框都必须先按键排序。
trades = pd.DataFrame({"time": [1, 3, 7], "price": [10, 11, 12]})
quotes = pd.DataFrame({"time": [0, 2, 5], "bid": [9, 10, 11]})
print(pd.merge_asof(trades, quotes, on="time"))merge_asof 的方向
默认情况下,merge_asof 采用 BACKWARD 方向(使用当前键之前或等于当前键的最新键)。使用 direction="forward" 或 "nearest" 可以更改匹配规则。
print(pd.merge_asof(trades, quotes, on="time", direction="nearest"))选择合适的连接方式
使用 内连接 仅保留匹配项,使用 左连接 为主表补充信息,使用 外连接 获取完整并集,使用 merge_asof 进行按时间对齐的(近似键)连接。
快速检查
请测试您对连接的掌握情况。
回顾
合并工具箱:
how=的 inner / left / outer 控制哪些键会保留- 使用
on或left_on/right_on指定键列 suffixes用于区分重名列indicator=True用于审查行的来源pd.merge_asof用于按最近键进行时间连接(请先排序)
常见问题解答
「高级合并与连接」课时是免费的吗?
是的 — 「高级合并与连接」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「高级合并与连接」这节课中我会学到什么?
使用 how、on、left_on/right_on 和 suffixes 配置 pd.merge(),并使用 merge_asof 进行基于时间的连接 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「高级合并与连接」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。