如何对Pandas DataFrame按ID分组,保留起止时间并求和Value列
解决方法:用Pandas GroupBy + Aggregate一键实现
你完全不用手动逐个处理每个id,Pandas的groupby配合agg方法就能轻松实现这个需求,代码简洁且不易出错。
实现代码
import pandas as pd import numpy as np # 构造原始DataFrame IDs = ['A','A','A','B','B'] times = pd.date_range(start='01/01/2019',end='01/02/2019',freq='h') times_2 = pd.date_range(start='01/01/2019',end='01/02/2019',freq='h') + pd.Timedelta('15min') Vals = [np.random.randint(15,250) for x in enumerate(times)] df = pd.DataFrame({'id' : IDs*5, 'Start' : times, 'End' : times_2, 'Value' : Vals},columns=['id','Start','End','Value']) # 核心分组聚合操作 result = df.groupby('id').agg( Start=('Start', 'min'), End=('End', 'max'), Value=('Value', 'sum') ).reset_index() print(result)
代码解释
groupby('id'):按id列对DataFrame进行分组agg(...):为每个分组的不同列指定专属聚合规则:Start=('Start', 'min'):提取每个id分组下Start列的最早时间End=('End', 'max'):提取每个id分组下End列的最晚时间Value=('Value', 'sum'):计算每个id分组下Value列的总和
reset_index():将分组用的id从索引还原为普通列,匹配你期望的输出格式
输出示例(与需求结构一致)
id Start End Value 0 A 2019-01-01 00:00:00 2019-01-01 22:15:00 2007 1 B 2019-01-01 03:00:00 2019-01-02 00:15:00 1385
这种方法彻底替代了手动遍历id的繁琐操作,而且Pandas内部的分组逻辑经过优化,运行效率也更高。
内容的提问来源于stack exchange,提问作者Umar.H
相关产品推荐
相关产品推荐

