商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何基于条件筛选并保留两个DataFrame中状态为“good”的共同策略记录

如何基于条件筛选并保留两个DataFrame中状态为“good”的共同策略记录

  发布于2026-07-20 阅读(0)

扫一扫,手机访问

本文介绍如何高效地从第一个dataframe中筛选出那些在第二个dataframe中对应策略号的状态仍为“good”的记录,避免低效循环,利用pandas向量化操作实现秒级处理。

实际做数据分析时,经常会遇到这么一种场景:手头有一张主表(比如原始策略清单),另一张是更新后的状态快照;现在需要根据快照里的状态,只保留主表中那些“当前仍有效”的记录。具体到本例,df 是原始策略清单,df_2 是最新的状态校验表,目标很清楚:只要 df 里那些 policy number 在 df_2 中对应 policy status == "good" 的行。

这个需求拆开其实就两步——

  1. df_2 中捞出所有状态为 "good" 的 policy number(也就是当前有效的策略号集合);
  2. 再从 df 里筛选出 policy number 刚好落在这个集合里的行。

用 Pandas 来做,一行 pd.Series.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', 'a verage', '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)。数据量上了百万级,效果尤其明显——几秒内就能出结果,完全不用干等。

本文转载于:https://www.php.cn/faq/2323863.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注