本文介绍如何高效比对两个pandas dataframe,根据共同键(如policy number)匹配后,仅保留df_2中对应“policy status”为"good"的记录在df中的行,避免低效循环,适用于大规模数据场景。
本文介绍如何高效比对两个pandas dataframe,根据共同键(如policy number)匹配后,仅保留df_2中对应“policy status”为"good"的记录在df中的行,避免低效循环,适用于大规模数据场景。
在实际数据分析中,常需基于参考表(如df_2)的业务状态对主表(如df)进行条件过滤——例如,仅保留那些在最新校验表中仍标记为“good”的保单。直接遍历行进行判断不仅代码冗长,更会在大数据量下显著拖慢执行速度(时间复杂度O(n×m))。推荐采用向量化操作,核心思路是:先从df_2中提取所有status为"good"的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']
})
# ✅ 高效筛选:获取df_2中status为"good"的所有policy number,再在df中匹配
valid_policy_numbers = df_2.loc[df_2['policy status'] == 'good', 'policy number']
result = df[df['policy number'].isin(valid_policy_numbers)]
print(result)输出结果:
policy number policy status 3 44 good 5 66 good 7 88 good
关键说明与注意事项:
- df_2.loc[df_2['policy status'] == 'good', 'policy number'] 返回一个Series,包含所有满足条件的policy number;
- isin() 是向量化方法,底层基于哈希查找,平均时间复杂度接近O(n),远优于嵌套循环;
- 若df或df_2中存在重复policy number,isin() 会自然保留所有匹配项(即df中重复编号也会被一并保留);
- 建议提前检查列名一致性(如本例中df含空格' policy status',而df_2为'policy status'),生产环境应统一清洗列名,避免隐式错误;
- 如需进一步排除df_2中未出现的policy number,当前逻辑已默认满足(因isin()仅匹配存在的值);若需保留df中全部原始字段且严格按df_2的"good"集合裁剪,此方案完全适用。
该方法简洁、可读性强,且具备良好扩展性——如需支持多状态联合判断(如'good' | 'average'),只需调整布尔条件即可。

















