You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于双条件筛选DataFrame行:提取含Year下ok/notok组合的Key数据

提取满足特定条件的DataFrame行的简洁实现

当然有简洁的实现方式!先明确你的需求:找出那些至少存在一个年份同时包含ok和notok记录的Key,然后保留这些Key的所有行,排除只有ok重复的Key(比如B)。

问题回顾

你的原始DataFrame数据:

Key Year Type
A 2000 ok
A 2001 ok
A 2001 notok
A 2002 ok
A 2003 ok
B 2000 ok
B 2001 ok
B 2001 ok
B 2002 ok
B 2003 ok
C 2000 ok
C 2001 ok
C 2002 ok
C 2003 ok

期望输出仅保留Key A的所有行:

Key Year Type
A 2000 ok
A 2001 ok
A 2001 notok
A 2002 ok
A 2003 ok

方案实现(分步+解释)

用Pandas的分组、统计和筛选组合就能轻松搞定,逻辑清晰且高效:

import pandas as pd

# 先构造你的示例DataFrame(实际使用时替换为你的数据)
df = pd.DataFrame({
    'Key': ['A']*5 + ['B']*5 + ['C']*4,
    'Year': [2000,2001,2001,2002,2003]*2 + [2000,2001,2002,2003],
    'Type': ['ok','ok','notok','ok','ok'] + ['ok']*5 + ['ok']*4
})

# 1. 按Key+Year分组,检查每组是否同时有ok和notok(唯一值数量≥2)
group_check = df.groupby(['Key', 'Year'])['Type'].nunique() >= 2

# 2. 提取所有符合条件的Key(只要该Key下有任意一个年份满足条件)
valid_keys = group_check[group_check].reset_index()['Key'].unique()

# 3. 筛选出这些Key的全部行
final_result = df[df['Key'].isin(valid_keys)]

print(final_result)

代码逻辑拆解

  • 分组统计:groupby(['Key', 'Year'])锁定每个Key的每一年份,nunique()统计该组内Type的不同值数量,≥2就说明同时存在ok和notok。
  • 提取有效Key:从满足条件的分组中取出对应的Key并去重,得到我们需要保留的Key集合。
  • 最终筛选:用isin()匹配原始DataFrame中的有效Key,直接得到目标结果。

极致简洁的一行式写法

如果喜欢更紧凑的代码,可以把上述逻辑合并成一行:

final_result = df[df['Key'].isin(df.groupby(['Key','Year'])['Type'].nunique().ge(2).reset_index()['Key'].unique())]

运行后就能得到你想要的输出啦!

内容的提问来源于stack exchange,提问作者bli12blu12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:02:39