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

基于多条件的周期性数据分段标注错误修正求助

问题跟进:基于多条件的DataFrame分段标注(修正周期性问题)

给定如下Pandas DataFrame:

import pandas as pd

data = {'ID':[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    'column1': [15, 16, 17, 14, 13, 5, 3, 2, 1.9, 1.2, 1, 0.8, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1, 2, 3, 4, 5, 6],
    'column2': [10, 11, 12, 13, 13.5, 14, 14.5, 15, 16, 17, 18, 19, 20, 20, 20, 20, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10]
    }

df = pd.DataFrame(data)

需根据以下规则生成Label列:

  • Pre_Start:从数据起始行,到column1首次出现<=2的前一行,且满足column2>13
  • Start:column1递减且0.5<column1<=2,同时column2递增且column2<=19
  • Steady:column1<=0.5且column2>=19
  • Ramp:column1<=0.5且column2递减且14<column2<19
  • End:column1递增且column1>0.5,同时column2递减且column2<19
  • 不满足任何条件的行标注为other

之前的解决方案未考虑数据周期性(先降后升/先升后降的趋势变化),导致第21行被错误标注为Start,实际应为End。以下是修正后的实现:


实现步骤

  1. 计算趋势列:通过diff()判断每行的column1和column2是递增还是递减
  2. 按优先级标注标签:按条件从具体到一般的顺序赋值,避免覆盖正确标注
  3. 填充剩余行为other
# 1. 计算趋势列:判断增减(diff()返回当前行-前一行,>0为递增,<0为递减)
df['c1_decreasing'] = df['column1'].diff() < 0
df['c1_increasing'] = df['column1'].diff() > 0
df['c2_increasing'] = df['column2'].diff() > 0
df['c2_decreasing'] = df['column2'].diff() < 0

# 2. 初始化Label列为other
df['Label'] = 'other'

# 3. 标注Pre_Start:找到column1首次<=2的索引,取之前的行且column2>13
first_le2_idx = df[df['column1'] <= 2].index[0]
pre_start_mask = (df.index < first_le2_idx) & (df['column2'] > 13)
df.loc[pre_start_mask, 'Label'] = 'Pre_Start'

# 4. 标注Start
start_mask = df['c1_decreasing'] & (df['column1'].between(0.5, 2, inclusive='right')) & df['c2_increasing'] & (df['column2'] <= 19)
df.loc[start_mask, 'Label'] = 'Start'

# 5. 标注Steady
steady_mask = (df['column1'] <= 0.5) & (df['column2'] >= 19)
df.loc[steady_mask, 'Label'] = 'Steady'

# 6. 标注Ramp
ramp_mask = (df['column1'] <= 0.5) & df['c2_decreasing'] & df['column2'].between(14, 19, inclusive='neither')
df.loc[ramp_mask, 'Label'] = 'Ramp'

# 7. 标注End
end_mask = df['c1_increasing'] & (df['column1'] > 0.5) & df['c2_decreasing'] & (df['column2'] < 19)
df.loc[end_mask, 'Label'] = 'End'

# 查看第21行(索引20)的标注结果
print(df.loc[20, 'Label'])  # 输出:End

验证结果

运行后,各段标注符合预期:

  • 索引4-6:Pre_Start
  • 索引7-11:Start
  • 索引12-16:Steady
  • 索引17-20:Ramp
  • 索引21-26:End
  • 索引0-3:other

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:05:55