Pandas DataFrame按a/b/c序列分组求和及时间提取需求求助
问题描述
给定如下DataFrame:
Name COST Timestamp 0 c 8 2023-09-20 15:14:46 1 a 8 2023-09-20 15:14:48 2 c 9 2023-09-20 15:14:55 3 b 10 2023-09-20 15:15:00 4 c 4 2023-09-20 15:15:02 5 a 9 2023-09-20 15:15:04 6 b 3 2023-09-20 15:15:12 7 a 3 2023-09-20 15:15:17 8 c 6 2023-09-20 15:15:20 9 c 6 2023-09-20 15:15:29
需要生成新DataFrame,规则如下:
- 按包含a、b、c的完整序列分组(元素出现顺序无关)
- 每组
sum_cost为组内a、b、c各自最后出现记录的COST之和 - 每组
Timestamp取组内最晚的时间戳 - 同一名称组内多次出现时,取最后一条记录
示例说明:
- 第一组取索引1的a、索引2的c、索引3的b,sum_cost=8+9+10=27,Timestamp取索引3的
2023-09-20 15:15:00 - 第二组取索引4的c、索引5的a、索引6的b,sum_cost=4+9+3=16,Timestamp取索引6的
2023-09-20 15:15:12
期望输出:
sum_cost Timestamp 0 27 2023-09-20 15:15:00 1 16 2023-09-20 15:15:12
解决方案
通过以下步骤实现需求:
- 生成分组标识:遍历数据,每当集齐a、b、c三个元素后,开启新分组
- 提取每组内各名称的最后一条记录
- 按分组计算成本总和与最晚时间戳
代码实现:
import pandas as pd # 加载原始数据 df = pd.DataFrame({ 'Name': ['c', 'a', 'c', 'b', 'c', 'a', 'b', 'a', 'c', 'c'], 'COST': [8, 8, 9, 10, 4, 9, 3, 3, 6, 6], 'Timestamp': pd.to_datetime(['2023-09-20 15:14:46', '2023-09-20 15:14:48', '2023-09-20 15:14:55', '2023-09-20 15:15:00', '2023-09-20 15:15:02', '2023-09-20 15:15:04', '2023-09-20 15:15:12', '2023-09-20 15:15:17', '2023-09-20 15:15:20', '2023-09-20 15:15:29']) }) # 步骤1:生成分组ID seen = set() group_id = 0 groups = [] for name in df['Name']: seen.add(name) groups.append(group_id) # 集齐三个元素后重置分组 if len(seen) == 3: seen.clear() group_id += 1 df['group'] = groups # 步骤2:提取每组内各Name的最后一条记录 last_records = df.groupby(['group', 'Name'], as_index=False).last() # 步骤3:计算每组的sum_cost和最晚Timestamp result = last_records.groupby('group').agg( sum_cost=('COST', 'sum'), Timestamp=('Timestamp', 'max') ).reset_index(drop=True) print(result)
运行后输出:
sum_cost Timestamp 0 27 2023-09-20 15:15:00 1 16 2023-09-20 15:15:12
内容的提问来源于stack exchange,提问作者Starlord22
相关产品推荐
相关产品推荐

