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 R

02 / 多对多风险

若某键在两边分别出现 m_k 和 n_k 次,join 后该键产生 m_k n_k 行。

rows_k = m_k * n_k

03 / 条件均值

groupby 的均值是在每个组 g 的条件样本上求经验期望。

mean_g(Y) = (1/n_g) sum_{i: G_i=g} Y_i

03 / 代码

带审计的 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 后没有检查每期样本数。

参考资料