如何修正DataFrame中连续≥4个零值块内行的标记逻辑?
问题分析与解决方案
原代码的问题在于它仅标记了连续零块中的首尾相关行:要么当前行和前3行都是零,要么当前行和后3行都是零。但对于连续零块中间的行(比如4个连续零里的第2、第3行),这两个条件都不满足,所以会被漏标。
比如你提到的2022-10-17 23:13:00和23:14:00,它们属于23:12-23:15的4个连续零块,原代码只标记了第一个(23:12)和最后一个(23:15),中间两行没被标记。
修正方案
我们可以通过分组标记连续零块的方式,把所有属于长度≥4的零块的行都标记为True:
# 1. 创建分组键:连续的零会被分到同一个组 group_key = (df['volume'] != 0).cumsum() # 2. 计算每个组的行数 group_size = df.groupby(group_key)['volume'].transform('size') # 3. 标记条件:当前行是零,且所在组的行数≥4 df['cannot_trade'] = (df['volume'] == 0) & (group_size >= 4)
验证结果
运行上述代码后,2022-10-17 23:12:00到23:15:00的4行都会被标记为True,所有长度≥4的连续零块内的行也都会正确标记。
另外,对于更长的零块(比如23:17-23:27的11个连续零),所有行都会被正确标记为True,不会再有漏标情况。
内容的提问来源于stack exchange,提问作者OldChi
相关产品推荐
相关产品推荐

