如何对Pandas DataFrame按id分组取yes行前一行,处理无前置行场景
解决方案
你可以通过分组内位移来同时解决分组逻辑和边界异常问题,代码如下:
import pandas as pd # 你的样例数据 df = pd.DataFrame(data={'id':[3,3,3,3,3,5,5,5,5,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7], 'outcome': ['no','no','no','yes','no','no','no','yes','yes','no','no','yes','yes','yes','yes','yes','no','no','no', 'no', 'yes', 'no', 'no', 'yes']}) # 核心逻辑:按id分组后,取每组内「下一行outcome为yes」的当前行 mask = df.groupby('id')['outcome'].shift(-1).eq('yes') pre_df = df[mask]
方案说明
- 分组内使用
shift(-1),位移操作只会在同一个id的组内生效,不会出现跨组取上一行的问题,满足分组需求 - 如果某组内第一行就是yes,它对应的上一行不存在,生成的mask对应位置会自动为False,不会被筛选出来,解决了无上行的异常
- 连续多个yes相邻的情况,只会取第一个yes的上一行,后面的yes的上一行是yes,不会被筛选,符合你忽略yes行之后内容的要求
内容的提问来源于stack exchange,提问作者Ze0ruso
相关产品推荐
相关产品推荐

