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

如何在Pandas中实现指定规则的累计求和生成Month列?

问题:在Pandas中按规则生成累计求和的Month列

原始数据

用户的DataFrame Start Date 列数据示例:

Start Date
0
NA
NA
0
NA
NA
0
NA
0
NA
0
NA
NA
...

该列的数值统计:

df['Start Date'].value_counts(dropna=False)
# 输出:
# NaN     2145
# 0.0      130
# Name: Start Date, dtype: int64

错误尝试

用户尝试的代码无法得到预期结果:

df['Month'] = df['Start Date'].where(df['Start Date'] == 0, df['Start Date'].shift() + 1)

预期输出

期望生成的Month列如下:

Month
0
1
2
0
1
2
0
1
0
1
0
1
2
...

解决方案

核心思路是按Start Date中的0进行分组,在每个分组内从0开始累计计数,具体代码如下:

# 生成分组标识:每遇到一个0就开启一个新分组
df['group'] = (df['Start Date'] == 0).cumsum()
# 在每个分组内从0开始累计计数,得到目标Month列
df['Month'] = df.groupby('group').cumcount()
# 若不需要保留group列,可执行删除
# df.drop('group', axis=1, inplace=True)

原理说明

  • (df['Start Date'] == 0).cumsum():将Start Date等于0的位置标记为1,其余为0,累加后会为每个以0开头的连续区块生成唯一的组ID。
  • groupby('group').cumcount():在每个组内从0开始逐行计数,正好匹配需求中每个0之后依次递增1的规则。

之前的代码失效原因:使用shift()+1时,遇到连续NaN会因上一行是NaN导致结果仍为NaN,且无法实现跨分组的计数重置,无法满足每个0开头区块独立计数的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:42:44