
本文介绍一种高效、向量化的方法,利用 pandas 的 isin() 和布尔索引,根据 policy number 关联两个 DataFrame,并仅保留 df 中那些在 df_2 中对应 policy status 为 "good" 的记录,避免低效循环。
本文介绍一种高效、向量化的方法,利用 pandas 的 `isin()` 和布尔索引,根据 policy number 关联两个 dataframe,并仅保留 df 中那些在 df_2 中对应 policy status 为 "good" 的记录,避免低效循环。
在实际数据分析中,我们常需基于主键(如 policy number)跨表校验状态一致性。例如,原始策略清单(df)中所有策略初始状态均为 "good",而另一张更新表(df_2)记录了最新状态;我们的目标是:仅保留在 df 中、且其 policy number 在 df_2 中对应 status 仍为 "good" 的行。
关键在于避免显式循环(如 for 遍历或 apply),而是采用 pandas 原生向量化操作。推荐解法如下:
# 步骤1:从 df_2 中提取所有 status == "good" 的 policy number good_policy_numbers = df_2.loc[df_2["policy status"] == "good", "policy number"] # 步骤2:在 df 中筛选 policy number 存在于上述集合中的行 result = df[df["policy number"].isin(good_policy_numbers)]
等价的一行写法(更简洁):
result = df[df["policy number"].isin(df_2.loc[df_2["policy status"] == "good", "policy number"])]
运行后输出:
policy number policy status 3 44 good 5 66 good 7 88 good
✅ 为什么高效?
- df_2.loc[...] 是 O(n) 向量过滤,isin() 底层使用哈希查找,平均时间复杂度接近 O(m),远优于嵌套循环的 O(m×n)。
- 全程无 Python 层循环,完全由 pandas/Cython 加速。
⚠️ 注意事项:
- 确保 policy number 列数据类型一致(如均为 int),否则 isin() 可能因类型不匹配返回空结果;可统一用 df["policy number"] = df["policy number"].astype(int) 处理。
- 若 df_2 中存在重复的 policy number,isin() 仍能正确匹配(只要至少一个满足 "good" 即可);如需严格一对一最新状态,建议先对 df_2 按时间戳去重或取最新记录。
- 若需同时校验多状态(如 "good" 或 "average"),可改用 df_2["policy status"].isin(["good", "average"])。
该方法简洁、可读性强,适用于百万级数据,是生产环境中处理跨表状态筛选的标准实践。










