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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:06:02