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

如何基于累计值创建分组并保留对应时间戳

按ID分组并基于累计值阈值生成分组

需求

按ID对数据分组,对每组的Value列计算累计求和;当累计值达到指定阈值时,创建对应分组,并记录该时刻的Days时间戳。

分组阈值

  • Doses A:累计值 ≥ 1000
  • Doses B:累计值 ≥ 3000
  • Doses C:累计值 ≥ 5000

输入数据

ID Value Days
A 0   5
A 1200  20
A 300   40 
A 1000  67    
A 1000  90
A 1000  110
A 500   115
B 0     5
B 500   10
B 600   15 
B 1000  25
B 2000  50
B 900   70
B 1000  90

期望输出

ID Group Days
A Doses A 20
A Doses B 90
A Doses C 115
B Doses A 15
B Doses B 50
B Doses C 70

解决方案(Python Pandas实现)

import pandas as pd

# 构造输入数据
df = pd.DataFrame({
    'ID': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B'],
    'Value': [0, 1200, 300, 1000, 1000, 1000, 500, 0, 500, 600, 1000, 2000, 900, 1000],
    'Days': [5, 20, 40, 67, 90, 110, 115, 5, 10, 15, 25, 50, 70, 90]
})

# 定义并排序阈值
threshold_map = {'Doses A': 1000, 'Doses B': 3000, 'Doses C': 5000}
sorted_thresholds = sorted(threshold_map.items(), key=lambda x: x[1])

result_list = []
# 按ID分组处理
for id, subgroup in df.groupby('ID'):
    subgroup['cumulative_value'] = subgroup['Value'].cumsum()
    threshold_index = 0
    # 遍历每组的累计值,匹配阈值
    for _, row in subgroup.iterrows():
        if threshold_index >= len(sorted_thresholds):
            break
        group_name, threshold = sorted_thresholds[threshold_index]
        if row['cumulative_value'] >= threshold:
            result_list.append({
                'ID': id,
                'Group': group_name,
                'Days': row['Days']
            })
            threshold_index += 1

# 转换为结果DataFrame并输出
result_df = pd.DataFrame(result_list)
print(result_df.to_string(index=False))

代码说明

  1. 按ID对原始数据分组,计算每组的Value累计和;
  2. 按阈值从小到大依次匹配,一旦累计值达到当前阈值,立即记录对应的ID、分组名和Days,并切换到下一个更高阈值;
  3. 最终将所有符合条件的记录整理成结果表。

内容的提问来源于stack exchange,提问作者BD'auria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:45:10