如何在Pandas中为达标列添加标签并计算达标所需时长
实现方案
用pandas分组处理即可实现需求,完整代码如下:
import pandas as pd # 构造输入数据(实际使用时替换成你自己的DataFrame读取逻辑即可) data = { 'ID': [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3], 'Date': ['2021-01','2021-02','2021-03','2021-04','2021-05', '2021-01','2021-02','2021-03','2021-04','2021-05', '2021-01','2021-02','2021-03','2021-04','2021-05'], 'Fixed Value': [500]*5 + [400]*5 + [300]*5, 'Variable Value': [10,200,300,400,500,5,20,70,400,500,10,300,500,600,700] } df = pd.DataFrame(data) # 第一步:日期列转datetime格式方便计算时间差 df['Date'] = pd.to_datetime(df['Date']) # 第二步:定义单ID分组处理逻辑 def process_single_id(group): # 先按日期排序避免原始数据乱序导致计算错误 group = group.sort_values('Date').reset_index(drop=True) # 筛选首次达到固定值的行 reach_filter = group['Variable Value'] >= group['Fixed Value'] # 兼容ID全程未达标的场景 if not reach_filter.any(): group['Reached_Fixed_Value'] = 'No' group['Time_To_Reach'] = 'na' return group # 取首次达标的日期和ID最早记录日期计算差值 first_reach_date = group.loc[reach_filter.idxmax(), 'Date'] start_date = group['Date'].min() month_diff = (first_reach_date.year - start_date.year)*12 + (first_reach_date.month - start_date.month) + 1 # 给新列赋值 group['Reached_Fixed_Value'] = group['Date'].ge(first_reach_date).map({True:'Yes', False:'No'}) group['Time_To_Reach'] = group['Date'].ge(first_reach_date).map({True: f'{month_diff} months', False: 'na'}) return group # 第三步:按ID分组应用处理逻辑 result = df.groupby('ID', group_keys=False).apply(process_single_id) # 可选:把日期列转回YYYY-MM字符串格式,和示例输出对齐 result['Date'] = result['Date'].dt.strftime('%Y-%m') print(result)
说明
- 月份差计算加1是为了和示例逻辑对齐,即从第一个统计月开始计数,2021-01到2021-02算2个月
- 代码兼容了部分ID全程未达到固定值的场景,若你确认所有ID最终都会达标可删除对应判断逻辑
- 输出结果和你给出的期望示例完全一致
内容的提问来源于stack exchange,提问作者epsilon
相关产品推荐
相关产品推荐

