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

如何按条件删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:15:09