如何按条件删除pandas DataFrame分组内首个yes前的no行
解决方案
核心思路:对每个id分组,通过累计求和标记第一个yes出现的位置,保留该位置及之后的所有行即可。
实现代码
import pandas as pd df = pd.DataFrame(data={ 'id': [3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6], 'outcome': ['no', 'no', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'yes', 'no', 'no', 'yes', 'no', 'no'] }) # 生成过滤掩码 filter_mask = df.groupby('id')['outcome'].transform(lambda group: group.eq('yes').cumsum() >= 1) # 筛选符合要求的行 result_df = df[filter_mask] print(result_df)
逻辑说明
- 对每个id的分组,
group.eq('yes')会将值为yes的行标记为True(等价于1),no的行标记为False(等价于0) - 用
cumsum()做累计求和:第一个yes出现之前的所有行累计和都是0,第一个yes出现后累计和变为1,后续所有行累计和都≥1 - 筛选累计和≥1的行,正好就是保留第一个
yes及之后的所有记录,符合需求。
原代码问题
你原有代码的x.ne('no')是逐行判断是否不等于no,仅yes行返回True,会直接过滤掉所有no记录,因此不符合要求。
内容的提问来源于stack exchange,提问作者Ze0ruso
相关产品推荐
相关产品推荐

