Data Engineering
pandas 数据清理、合并与面板构造
把 merge、reshape、groupby 看成数据矩阵和索引集合上的可验证变换。
Mechanism Lab
动画:join 如何改变样本支持集
动画展示左表、右表、交集和 left_only 样本如何移动到最终分析样本。
Step 1 / 5
Keys
先确认观测单位和键。
key = (id, year)Animation Control
Reduced-motion users receive the same step states without continuous motion.
01 / 直觉
核心直觉
pandas 的重点不是 API 记忆,而是维护观测单位、键、时间维度和样本流。
每次 merge 都是在改变样本支持集;每次 groupby 都是在定义统计量的条件集合。
实证错误常来自重复键、隐性多对多合并、面板不平衡和样本数漂移。
02 / 数学
合并和聚合的数学对象
01 / 键集合
把左表和右表分别看成键集合 L 和 R。inner join 的支持集是交集。
support(inner_join) = L cap R02 / 多对多风险
若某键在两边分别出现 m_k 和 n_k 次,join 后该键产生 m_k n_k 行。
rows_k = m_k * n_k03 / 条件均值
groupby 的均值是在每个组 g 的条件样本上求经验期望。
mean_g(Y) = (1/n_g) sum_{i: G_i=g} Y_i03 / 代码
带审计的 merge
在合并前后检查键重复和样本数,避免 silent sample drift。
import pandas as pd
left = pd.read_csv("students.csv")
right = pd.read_csv("scores.csv")
assert not left.duplicated(["student_id", "year"]).any()
assert not right.duplicated(["student_id", "year"]).any()
merged = left.merge(
right,
on=["student_id", "year"],
how="left",
validate="one_to_one",
indicator=True,
)
audit = merged["_merge"].value_counts(dropna=False)
print(audit)
panel = merged.pivot_table(
index="student_id",
columns="year",
values="score",
aggfunc="mean",
)04 / 案例
案例:学生面板数据的样本流审计
- 检查 student_id-year 是否唯一。
- 记录 left_only、right_only、both 的行数。
- 在每个年份输出缺失率,防止样本漂移影响 DID 或事件研究。
05 / 风险
常见误区
没有使用 validate 参数。
把缺失的合并结果直接 drop 掉。
面板 reshape 后没有检查每期样本数。