如何为DataFrame添加各站点预处理、处理中、处理后阶段的列标签
化学喷洒站点访问记录阶段标注解决方案
核心实现思路
先按站点对所有记录做分组,同组内的记录按访问日期升序排序,定位到该站点完成喷洒作业的记录后,按时间前后即可批量标注其余记录的所属阶段,无需写复杂的嵌套循环。
具体实现步骤
步骤1:数据预处理
- 确认数据集至少包含
站点ID、访问日期、是否当日完成喷洒3个核心字段 - 统一日期字段的格式,避免因格式不统一出现排序、比对错误
步骤2:单站点标注逻辑(可直接批量套用到所有站点分组)
对单个站点排序后的所有访问记录:
- 先定位
是否当日完成喷洒为是的记录,该条直接标注为活跃处理阶段 - 所有访问日期早于喷洒日期的记录,统一标注为预处理阶段
- 所有访问日期晚于喷洒日期的记录,统一标注为后处理阶段
注:如果单个站点存在多条标记为完成喷洒的记录,建议先做数据清洗确认有效作业记录,再执行标注逻辑。
代码实现参考
Pandas向量化实现(效率远高于循环,适合大数据量)
import pandas as pd # 假设df为你的原始数据集 # 统一转日期格式 df['访问日期'] = pd.to_datetime(df['访问日期']) # 按站点ID、访问日期升序排序 df = df.sort_values(['站点ID', '访问日期']).reset_index(drop=True) # 提取每个站点的首次喷洒日期 spray_dates = df[df['是否当日完成喷洒'] == '是'].groupby('站点ID')['访问日期'].first().rename('喷洒日期') # 关联回原数据集 df = df.merge(spray_dates, on='站点ID', how='left') # 批量标注阶段 def label_stage(row): if pd.isna(row['喷洒日期']): return '无喷洒记录' # 可按业务需求调整返回值 if row['访问日期'] < row['喷洒日期']: return '预处理阶段' elif row['访问日期'] == row['喷洒日期']: return '活跃处理阶段' else: return '后处理阶段' df['处理阶段'] = df.apply(label_stage, axis=1)
for循环实现(适合小数据量、需要自定义特殊逻辑的场景)
# 第一步:按站点ID聚合所有记录 site_dict = {} for record in 原始数据集: site_id = record["站点ID"] if site_id not in site_dict: site_dict[site_id] = [] site_dict[site_id].append(record) # 第二步:逐站点标注 final_result = [] for site_id, records in site_dict.items(): # 同站点记录按日期排序 sorted_records = sorted(records, key=lambda x: x["访问日期"]) # 定位当前站点的喷洒日期 spray_date = None for rec in sorted_records: if rec["是否当日完成喷洒"] == "是": spray_date = rec["访问日期"] break # 逐记录标注阶段 for rec in sorted_records: if rec["访问日期"] < spray_date: rec["处理阶段"] = "预处理阶段" elif rec["访问日期"] == spray_date: rec["处理阶段"] = "活跃处理阶段" else: rec["处理阶段"] = "后处理阶段" final_result.append(rec)
内容的提问来源于stack exchange,提问作者BWolff
相关产品推荐
相关产品推荐

