发布于2026-07-20 阅读(0)
扫一扫,手机访问
本文介绍如何高效地从第一个dataframe中筛选出那些在第二个dataframe中对应策略号的状态仍为“good”的记录,避免低效循环,利用pandas向量化操作实现秒级处理。
实际做数据分析时,经常会遇到这么一种场景:手头有一张主表(比如原始策略清单),另一张是更新后的状态快照;现在需要根据快照里的状态,只保留主表中那些“当前仍有效”的记录。具体到本例,df 是原始策略清单,df_2 是最新的状态校验表,目标很清楚:只要 df 里那些 policy number 在 df_2 中对应 policy status == "good" 的行。
这个需求拆开其实就两步——
用 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)。数据量上了百万级,效果尤其明显——几秒内就能出结果,完全不用干等。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8