You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python Pandas DataFrame中识别条件首次出现并标记买卖状态?

实现Pandas中基于序列状态的STATUS列生成

这是一个典型的依赖序列状态的问题——新列STATUS的取值完全依赖于之前的标记结果,直接用Pandas的矢量化操作会比较绕,用迭代遍历的方式反而更直观清晰。下面是完全匹配你需求的实现方案:

步骤1:构造示例数据集(可替换为你的真实数据)

import pandas as pd

# 你提供的示例数据
data = {
    'Col': [0, -1.41, 0, -7.37, -8.78, -11.6, 0, -5, -6.1, -8, -11, 0, 0, -9]
}
df = pd.DataFrame(data)

步骤2:实现STATUS列生成逻辑

# 初始化STATUS列为0
df['STATUS'] = 0

# 跟踪两个关键状态:是否出现过Buy,以及最近的非0 STATUS值
has_buy = False
last_non_zero_status = None

# 遍历每一行数据
for idx, row in df.iterrows():
    current_col = row['Col']
    
    # 处理第一行的特殊情况
    if idx == 0:
        if current_col == 0:
            df.loc[idx, 'STATUS'] = 'Buy'
            has_buy = True
            last_non_zero_status = 'Buy'
        continue
    
    # 规则a:满足Col==0,且最近的非0状态是Sell时标记为Buy
    if current_col == 0:
        if last_non_zero_status == 'Sell':
            df.loc[idx, 'STATUS'] = 'Buy'
            last_non_zero_status = 'Buy'
    
    # 规则b:满足Col<=-8,且之前出现过Buy,且最近的非0状态不是Sell时标记为Sell
    elif current_col <= -8:
        if has_buy and last_non_zero_status != 'Sell':
            df.loc[idx, 'STATUS'] = 'Sell'
            last_non_zero_status = 'Sell'
    
    # 其他情况保持STATUS为0,且不更新last_non_zero_status(保留最近的有效状态)

验证结果

运行上述代码后,df的输出完全匹配你的示例:

ColSTATUS
00Buy
1-1.410
200
3-7.370
4-8.78Sell
5-11.60
60Buy
7-50
8-6.10
9-8Sell
10-110
110Buy
1200
13-9Sell

逻辑说明

  • has_buy变量确保只有在出现过Buy标记后,才能标记Sell;
  • last_non_zero_status变量跟踪最近一次的有效标记(Buy/Sell),避免连续出现相同的标记;
  • 遍历过程中仅在满足规则时更新STATUS和状态变量,其他情况保持默认的0,同时保留最近的有效状态。

内容的提问来源于stack exchange,提问作者 vista

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:17:45