按ID、key分组并按日计算Speed累计求和的异常问题排查
问题原因及解决方法
问题根源
你当前代码的核心问题是逻辑错误:
- 使用
group.groupby(pd.Grouper(key='Time', freq='1d'))['Speed'].cumsum()时,cumsum是对每日分组内的每一行原始数据做累加,而非先计算每日的Speed总和再做累计。比如某天有3条数据,这一步会生成3个累加值(第1条的Speed、前2条的Speed和、前3条的Speed和),最终结果行数和原数据一致,自然远多于你期望的每日一行。 - 循环中用
append拼接DataFrame属于低效操作,但这不是导致行数超标的直接原因。
正确实现方式
要实现「每个ID、key组合下,每日一行的Speed累计求和」,需要分两步:先按天聚合每日Speed总和,再对这些日总和做跨天的累计。
方法一:显式提取日期列
import pandas as pd df = pd.read_csv('df.csv') df['Time'] = pd.to_datetime(df['Time'], format='%Y-%m-%d %H:%M:%S') # 提取日期部分,方便分组 df['date'] = df['Time'].dt.date # 1. 按ID、key、日期分组,计算每日Speed总和 daily_total = df.groupby(['ID', 'key', 'date'])['Speed'].sum().reset_index() # 2. 按ID、key分组,对每日总和做累计求和 daily_total['cumulative_speed'] = daily_total.groupby(['ID', 'key'])['Speed'].cumsum() # 整理最终结果(保留需要的列) final_result = daily_total[['ID', 'key', 'date', 'cumulative_speed']]
方法二:直接使用时间分组器(更简洁)
import pandas as pd df = pd.read_csv('df.csv') df['Time'] = pd.to_datetime(df['Time'], format='%Y-%m-%d %H:%M:%S') # 一步完成:先按ID、key、天粒度分组求和,再在ID、key组内做累计 final_result = ( df.groupby(['ID', 'key', pd.Grouper(key='Time', freq='1d')])['Speed'] .sum() .groupby(level=['ID', 'key']) .cumsum() .reset_index(name='cumulative_speed') )
结果说明
最终的final_result中,每个ID+key组合下,每一行对应一天的累计Speed值(即从该组合的第一天到当前天的Speed总和),行数与你期望的一致。
内容的提问来源于stack exchange,提问作者lopusfx
相关产品推荐
相关产品推荐

