基于条件比较两个DataFrame并剔除不符合要求的数据
高效实现DataFrame按指定条件筛选的方案
针对你提出的需求——从df中仅保留在df_2里policy number匹配且policy status为good的记录,以下是两种远快于逐行遍历的高效实现方法:
方法一:筛选+isin(简洁优先)
利用pandas的向量化筛选和isin()方法,直接定位符合条件的记录:
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的保单编号 valid_policies = df_2[df_2['policy status'] == 'good']['policy number'] # 第二步:过滤df,只保留符合条件的行 filtered_df = df[df['policy number'].isin(valid_policies)] print(filtered_df)
执行后输出:
policy number policy status 3 44 good 5 66 good 7 88 good
方法二:Merge合并筛选(需保留额外字段时适用)
如果后续需要用到df_2中的其他字段,用merge操作可以同时完成匹配和筛选:
# 先筛选df_2的有效记录,再与df做内连接 merged_result = df.merge( df_2[df_2['policy status'] == 'good'], on='policy number', how='inner' ) # 保留原df的status字段(按需调整列名) final_df = merged_result[['policy number', 'policy status_x']].rename( columns={'policy status_x': 'policy status'} ) print(final_df)
输出结果与方法一完全一致。
为什么这两种方法更高效?
这两种方案都是基于pandas的向量化操作,底层由C语言实现,避免了Python层面的逐行循环,处理大规模数据集时,速度和内存占用会比逐行遍历优化几个数量级,完全适配你的大数据场景。
内容的提问来源于stack exchange,提问作者Ranger
相关产品推荐
相关产品推荐

