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

Pandas:如何按特定条件删除每个分组内的指定行?

Pandas实现分组内DataFrame的精准截断

原始数据

import pandas as pd

df = pd.DataFrame({
    'Event': [
        'completedPass', 'completedPass', 'takeon', 'failedPass', 
        'takeon', 'dribbleYES', 'shot', 'takeon', 'dribbleNO', 
        'completedPass', 'completedPass', 'shot', 'completedPass', 
        'completedPass', 'completedPass'
    ],
    'NumeroPosesion': [1]*7 + [2]*8
})

需求说明

  • 按NumeroPosesion分组,每个分组保留到**首次出现shot**的行,删除该行之后的所有内容
  • 从分组的最后一行(即shot行)向上遍历,直到遇到Event不属于['takeon', 'completedPass', 'dribbleYES']的行,删除该行及之前的所有内容

实现代码

步骤1:截断到首次shot行

先对每个分组做初步截断,只保留首次shot及之前的行:

# 分组后保留到第一个shot的行
df_trimmed = df.groupby('NumeroPosesion').apply(
    lambda g: g.loc[:g[g['Event'] == 'shot'].index[0]]
).reset_index(drop=True)

步骤2:从末尾向上筛选有效行

再对截断后的分组做二次筛选,保留从第一个不符合条件的行之后到shot的内容:

def filter_valid_rows(group):
    # 倒序遍历分组的索引
    for idx in reversed(group.index):
        event = group.loc[idx, 'Event']
        # 找到第一个不在允许列表里的行(shot本身是终点,也需要排除判断)
        if event not in ['takeon', 'completedPass', 'dribbleYES', 'shot']:
            return group.loc[idx+1:]
    # 若所有行都符合要求,直接返回
    return group

final_df = df_trimmed.groupby('NumeroPosesion').apply(filter_valid_rows).reset_index(drop=True)

最终结果

print(final_df)
# 输出:
#             Event  NumeroPosesion
# 0          takeon               1
# 1      dribbleYES               1
# 2            shot               1
# 3  completedPass               2
# 4  completedPass               2
# 5            shot               2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:41:05