基于双条件筛选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
相关产品推荐
相关产品推荐

