
本文介绍如何高效地从第一个dataframe中筛选出那些在第二个dataframe中对应策略号的状态仍为“good”的记录,避免低效循环,利用pandas向量化操作实现秒级处理。
本文介绍如何高效地从第一个dataframe中筛选出那些在第二个dataframe中对应策略号的状态仍为“good”的记录,避免低效循环,利用pandas向量化操作实现秒级处理。
在实际数据分析工作中,我们常需基于外部参考表对主数据进行条件过滤——例如,仅保留那些在最新校验表中仍处于有效(如 "good")状态的记录。本例中,df 是原始策略清单,df_2 是更新后的状态快照;目标是:仅保留在 df 中存在、且其 policy number 在 df_2 中对应 policy status == "good" 的行。
这一需求的关键在于两步逻辑组合:
- 从 df_2 中提取所有 policy status == "good" 对应的 policy number(即当前有效的策略号集合);
- 在 df 中筛选出 policy number 属于该集合的行。
使用 pd.Series.isin() 配合布尔索引即可高效完成,完全避免 Python 层循环,充分发挥 Pandas 底层优化优势:
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']
})
# ✅ 高效筛选:仅保留 df 中 policy number 同时存在于 df_2["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
⚠️ 注意事项:
- 列名需严格匹配(如示例中 df 的 ' policy status' 含前导空格,而 df_2 为 'policy status'),建议统一清洗列名:df.columns = df.columns.str.strip();
- 若存在重复 policy number,isin() 仍能正确工作(只要至少一个匹配即视为 True);
- 如需保留 df_2 中的最新状态字段,可改用 merge() 实现左连接后过滤:
merged = df.merge(df_2, on="policy number", how="inner", suffixes=("", "_new")) result = merged[merged["policy status_new"] == "good"].drop(columns=["policy status_new"])
该方法时间复杂度为 O(n + m),远优于嵌套循环的 O(n × m),尤其适用于百万级数据场景。











