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

基于条件处理DataFrame分组:删除指定组及后续行

解决DataFrame分组后的两类数据过滤需求

以下是基于Pandas实现你需求的具体代码和步骤,先构造示例数据模拟场景,再逐步处理:

1. 构造示例数据

import pandas as pd

data = {
    'ID': [3,3,3,4,4,4,4,4,5,5,5],
    'Event': ['Success', 'Success', 'Click', 'Success', 'Success', 'Click', 'Success', 'Click', 'Click', 'Success', 'Email']
}
df = pd.DataFrame(data)

2. 定义分组处理函数

def process_group(group):
    # 找到分组内第一个非Success事件的索引
    first_non_success = group[group['Event'] != 'Success'].index.min()
    
    # 情况1:分组全是Success,直接删除整个组
    if pd.isna(first_non_success):
        return pd.DataFrame()
    
    # 情况2:开头是连续Success,且后续无其他Success,删除整个组(对应ID=3的场景)
    first_event = group.iloc[0]['Event']
    has_later_success = (group.loc[first_non_success:, 'Event'] == 'Success').any()
    if first_event == 'Success' and not has_later_success:
        return pd.DataFrame()
    
    # 情况3:保留组,先删除开头的连续Success行(对应ID=4的场景)
    filtered_group = group.loc[first_non_success:]
    
    # 第二步:删除最后一个Success之后的所有行(所有保留组都需要处理)
    last_success_idx = filtered_group[filtered_group['Event'] == 'Success'].index.max()
    if not pd.isna(last_success_idx):
        filtered_group = filtered_group.loc[:last_success_idx]
    
    return filtered_group

3. 应用分组处理

result = df.groupby('ID', group_keys=False).apply(process_group)
print(result)

代码说明

  • 针对需求1:通过判断分组内第一个非Success的位置,以及后续是否还有Success,来决定是否删除整个组或仅删除开头的连续Success行。
  • 针对需求2:在保留的分组中,定位最后一个Success的索引,截取该索引之前的所有行,自动删除后续内容。
  • 最终结果会自动过滤掉ID=3的所有行,ID=4仅保留Click、Success两行,ID=5仅保留Click、Success两行,完全匹配你的示例要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:36:31