基于条件处理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
相关产品推荐
相关产品推荐

