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

pandas中按指定列分组生成每组从0重置计数的天数列

Pandas 分组生成从0起始的组内序号实现方案

你需要的按分组维度重置计数器、按出现顺序标注0起始序号的需求,可以直接用pandas内置方法实现,不需要自定义循环,以下是可直接复用的实现方式:

推荐方案:groupby + cumcount(性能最优,适配原始数据顺序场景)

cumcount()是pandas专门为分组场景设计的顺序计数函数,默认从0开始编号,每个新分组出现时自动重置计数器,完全匹配你的需求:

import pandas as pd

# 构造示例数据集
df = pd.DataFrame({
    'Group': ['a','a','a','b','b','b','c','c','c'],
    'Date': ['1/1/2022','1/2/2022','1/3/2022','1/1/2022','1/2/2022','1/3/2022','1/1/2022','1/2/2022','1/3/2022']
})

# 生成组内序号
df['Day'] = df.groupby('Group').cumcount()

注意:如果你的原始数据没有按日期排序,需要先做日期格式转换和排序,避免序号和日期顺序不匹配:

# 日期格式转换 + 按组、日期排序
df['Date'] = pd.to_datetime(df['Date'])
df = df.sort_values(by=['Group', 'Date']).reset_index(drop=True)
# 再生成序号
df['Day'] = df.groupby('Group').cumcount()

备选方案:rank 排序计数(适配严格按日期值编号的场景)

如果原始数据行顺序混乱,需要严格按照日期值的先后顺序生成序号,可以用分组rank的方式实现,rank默认从1开始计数,减1即可得到0起始的序号:

df['Day'] = df.groupby('Group')['Date'].rank(method='first').astype(int) - 1

执行以上代码后,得到的结果和你给出的预期效果完全一致:

GroupDateDay
a1/1/20220
a1/2/20221
a1/3/20222
b1/1/20220
b1/2/20221
b1/3/20222
c1/1/20220
c1/2/20221
c1/3/20222

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:09:20