如何在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的输出完全匹配你的示例:
| Col | STATUS | |
|---|---|---|
| 0 | 0 | Buy |
| 1 | -1.41 | 0 |
| 2 | 0 | 0 |
| 3 | -7.37 | 0 |
| 4 | -8.78 | Sell |
| 5 | -11.6 | 0 |
| 6 | 0 | Buy |
| 7 | -5 | 0 |
| 8 | -6.1 | 0 |
| 9 | -8 | Sell |
| 10 | -11 | 0 |
| 11 | 0 | Buy |
| 12 | 0 | 0 |
| 13 | -9 | Sell |
逻辑说明
has_buy变量确保只有在出现过Buy标记后,才能标记Sell;last_non_zero_status变量跟踪最近一次的有效标记(Buy/Sell),避免连续出现相同的标记;- 遍历过程中仅在满足规则时更新STATUS和状态变量,其他情况保持默认的0,同时保留最近的有效状态。
内容的提问来源于stack exchange,提问作者 vista
相关产品推荐
相关产品推荐

