如何基于DataFrame中Check列的条件切换Skip列的布尔值?
解决方案
要实现当Check列值为True时翻转Skip列状态,否则保持上一状态的需求,核心是让Skip列的当前值依赖于历史翻转次数,而非独立计算。以下是两种高效实现方式:
方法一:向量化累积计算(推荐,适合大数据集)
利用cumsum()统计Check列中True的累积次数,通过判断累积次数的奇偶性来确定当前Skip状态:
- 累积次数为偶数:未翻转/翻转偶数次 → Skip=False
- 累积次数为奇数:翻转奇数次 → Skip=True
代码示例:
# 假设df_ohlcv已生成Check列 df_ohlcv["Check"] = ... # 你的条件逻辑 # 生成Skip列 df_ohlcv["Skip"] = (df_ohlcv["Check"].cumsum() % 2).astype(bool)
验证你的示例数据:
Check列的累积和依次为0,0,0,1,1,1,1,2,2,2,2,3,3,3,取余2后得到0,0,0,1,1,1,1,0,0,0,0,1,1,1,转布尔值后完全匹配你期望的Skip列结果。
方法二:迭代遍历(适合小数据集)
通过循环逐行更新Skip状态,直观易懂但效率较低:
skip_state = False # 初始状态 skip_list = [] for check_val in df_ohlcv["Check"]: if check_val: skip_state = not skip_state skip_list.append(skip_state) df_ohlcv["Skip"] = skip_list
为什么你的原代码失效?
原代码中df_ohlcv["Skip"].where(...)的问题在于:
- 未初始化Skip列时会触发
KeyError; - 若初始化固定值(如False),向量化操作会基于初始值而非上一行状态翻转,导致无法保留历史状态,最终Skip列只会在初始值和单次翻转值间切换,而非持续继承状态。
内容的提问来源于stack exchange,提问作者Omegaruins
相关产品推荐
相关产品推荐

