如何基于累计值创建分组并保留对应时间戳
按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))
代码说明
- 按
ID对原始数据分组,计算每组的Value累计和; - 按阈值从小到大依次匹配,一旦累计值达到当前阈值,立即记录对应的
ID、分组名和Days,并切换到下一个更高阈值; - 最终将所有符合条件的记录整理成结果表。
内容的提问来源于stack exchange,提问作者BD'auria
相关产品推荐
相关产品推荐

