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
相关产品推荐
相关产品推荐

