本文介绍一种高效、向量化的方法,通过 isin() 和布尔索引快速比对两个 DataFrame:仅保留在 df_2 中 policy status 为 "good" 的 policy number 对应的 df 中原始记录,避免低效循环。
本文介绍一种高效、向量化的方法,通过 `isin()` 和布尔索引快速比对两个 dataframe:仅保留在 df_2 中 policy status 为 "good" 的 policy number 对应的 df 中原始记录,避免低效循环。
在数据分析中,常需基于主键(如 policy number)跨表校验状态并过滤原始数据。本例目标明确:从 df 中仅保留那些在 df_2 中对应 policy number 的 policy status 值为 "good" 的行。关键在于避免使用 for 循环逐行比对——这对大规模数据集(数万行以上)会造成显著性能瓶颈。
推荐采用完全向量化的 Pandas 操作,核心思路分两步:
- 从 df_2 中提取“合格”的 policy number 列表:筛选 df_2[df_2["policy status"] == "good"],再取出其 "policy number" 列;
- 在 df 中进行成员判断并索引:使用 df["policy number"].isin(...) 生成布尔掩码,直接索引 df。
完整代码如下:
import pandas as pd
df = pd.DataFrame({
'policy number': [11, 22, 33, 44, 55, 66, 77, 88, 99],
' policy status': ['good', 'good', 'good', 'good', 'good', 'good', 'good', 'good', 'good']
})
df_2 = pd.DataFrame({
'policy number': [11, 83, 63, 44, 55, 66, 67, 88, 99, 100],
'policy status': ['bad', 'bad', 'good', 'good', 'bad', 'good', 'bad', 'good', 'average', 'good']
})
# ✅ 高效实现:一行完成条件比对与过滤
result = df[df["policy number"].isin(
df_2.loc[df_2["policy status"] == "good", "policy number"]
)]
print(result)
输出结果:
policy number policy status 3 44 good 5 66 good 7 88 good
✅ 为什么这更优?
- isin() 底层基于哈希查找,时间复杂度接近 O(n),远优于嵌套循环的 O(n×m);
- 全程无 Python 层迭代,充分利用 Pandas/Cython 加速;
- 代码简洁、可读性强,易于维护和复用。
⚠️ 注意事项:
- 确保 policy number 在两个 DataFrame 中数据类型一致(如均为 int64),否则 isin() 可能因隐式类型转换失败;可用 df["policy number"] = df["policy number"].astype(int) 统一预处理;
- 若 df_2 中存在重复的 policy number,isin() 仍能正确识别(去重非必需);
- 如需保留 df 中原始顺序且不关心 df_2 的顺序,当前方法天然满足;若需按 df_2 中 "good" 记录的出现顺序排列结果,可在最后加 .sort_values("policy number") 或使用 merge 方案。
该方法是 Pandas 数据清洗与关联过滤的标准实践,适用于保险、金融、用户行为分析等多场景的策略匹配任务。










