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

为何DataFrame累计求和出现下降?原特征最小值为0

累计求和结果异常下降的原因与修复方案

我的数据中有一个特征,其数值随时间戳的变化如图所示(原特征值与时间戳关系图)。尝试用代码df['Cumulative'] = df['feature'].cumsum()对DataFrame中int64类型的特征列计算累计求和,但结果出现下降情况——而原特征列的最小值为0,这显然不符合预期。

可能的成因

  • 数据行未按时间戳升序排列:cumsum()是严格按照DataFrame当前的行顺序逐行累加的。如果数据行不是按时间戳从早到晚排序,累加结果的变化趋势会和时间维度下的真实累计情况不符,甚至出现看似“下降”的异常(比如后续行对应更早时间点的特征值为0,从时间序列角度看累计值没有增长,但如果之前的行是晚时间点的大值,就会给人“累计值下降”的错觉)。
  • int64整数溢出:int64类型的最大值为9223372036854775807,当累计求和的结果超过这个阈值时,会触发整数回绕,数值突然变为负数,从视觉上看就是累计值大幅下降。这种情况在特征值持续较大、累加次数较多时容易发生。

修复方案

1. 先按时间戳排序,再执行累加

确保数据行按时间戳从早到晚的顺序排列,再计算累计求和:

# 假设时间戳列名为'timestamp',先排序并重置索引
df = df.sort_values(by='timestamp').reset_index(drop=True)
# 计算累计求和
df['Cumulative'] = df['feature'].cumsum()

2. 解决整数溢出问题

将特征列转换为支持更大数值范围的类型,避免溢出:

# 方案一:转换为float64类型后累加
df['Cumulative'] = df['feature'].astype('float64').cumsum()

# 方案二:转换为Python原生int类型(支持任意大整数)
df['Cumulative'] = df['feature'].apply(int).cumsum()

内容的提问来源于stack exchange,提问作者Egorsky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:01:01