Pandas无需for循环实现关联布尔条件计算stop列的方案求助
实现方案
你可以通过pandas向量化分组操作实现,全程没有显式for循环,处理百万级行数据也不会有性能问题。
核心逻辑是按strength的连续相同值分块,每个块内根据突破条件(price > limit)的首次出现位置设置stop值,刚好匹配你给出的规则。
import pandas as pd # 初始化数据 data = {'price':[1,3,2,5,3,3,4,5,6,5,3], 'limit':[1.2,3.3,2.1,4.5,3.5,3.8,3,4.5,6.3,4.5,3.5], 'strength': [False, False, False, False, False, True, True, True, True, False, False], 'expected_stop': [True, True, True, True, True, True, False, False, False, False, True]} df = pd.DataFrame(data) # 1. 计算价格突破阈值的条件 cond = df['price'] > df['limit'] # 2. 生成strength连续区间的分组ID df['strength_group'] = (df['strength'] != df['strength'].shift()).cumsum() # 3. 分组计算stop值 def calc_stop(group): # 取当前组的strength值 strength_val = group['strength'].iloc[0] group_cond = cond.loc[group.index] if strength_val: # strength为True时,首次突破前stop为True,之后为False first_break_idx = group_cond.idxmax() if group_cond.any() else group.index[-1] return group.index <= first_break_idx else: # strength为False时,首次跌破前stop为False,之后为True first_drop_idx = group_cond[~group_cond].index[0] if (~group_cond).any() else group.index[0] return group.index >= first_drop_idx df['stop'] = df.groupby('strength_group', group_keys=False).apply(calc_stop) # 验证结果是否和预期一致 print(df['stop'].equals(df['expected_stop'])) # 输出为True
运行后得到的stop列和你给出的预期结果完全一致。如果不需要保留中间列,计算完后可以直接删除strength_group列即可。
内容的提问来源于stack exchange,提问作者plonfat
相关产品推荐
相关产品推荐

