基于多条件的周期性数据分段标注错误修正求助
问题跟进:基于多条件的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。以下是修正后的实现:
实现步骤
- 计算趋势列:通过
diff()判断每行的column1和column2是递增还是递减 - 按优先级标注标签:按条件从具体到一般的顺序赋值,避免覆盖正确标注
- 填充剩余行为
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
相关产品推荐
相关产品推荐

