如何校验Pandas DataFrame的Series中每两个1之间是否存在值2
问题解答
需求实现方案
你可以通过分组标记相邻1的区间,再判断区间内是否存在2来实现需求,示例代码如下:
import pandas as pd # 构造测试数据 df = pd.DataFrame({'A': [2,1,6,3,2,7,1,3,2,1,3]}) # 步骤1:生成相邻1的分组标记,每遇到1就进入下一个分组 df['group'] = df['A'].eq(1).cumsum() # 步骤2:B列默认值设为False df['B'] = False # 步骤3:筛选出分组内存在2、且当前行A等于2的记录,将B设为True df.loc[ df.groupby('group')['A'].transform(lambda x: x.eq(2).any()) & df['A'].eq(2), 'B' ] = True # 删掉辅助分组列 df = df.drop('group', axis=1)
输出结果和你给出的预期完全一致。
关于rolling函数窗口范围的说明
pandas的rolling支持自定义窗口范围,分两种场景:
- 针对时间索引的数据集,可以直接传入时间偏移量作为窗口参数(比如
window='30D'代表30天的窗口),自动匹配对应时间长度的动态窗口 - 针对普通数值索引的数据集,默认的rolling只支持固定大小的整数窗口,如果要处理长度不固定的动态区间(比如本题中两个相邻1之间的区间长度不固定),用rolling实现起来非常繁琐,更推荐使用上述的分组方案。
内容的提问来源于stack exchange,提问作者Claudio Ferraro
相关产品推荐
相关产品推荐

