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
执行以上代码后,得到的结果和你给出的预期效果完全一致:
| Group | Date | Day |
|---|---|---|
| a | 1/1/2022 | 0 |
| a | 1/2/2022 | 1 |
| a | 1/3/2022 | 2 |
| b | 1/1/2022 | 0 |
| b | 1/2/2022 | 1 |
| b | 1/3/2022 | 2 |
| c | 1/1/2022 | 0 |
| c | 1/2/2022 | 1 |
| c | 1/3/2022 | 2 |
内容的提问来源于stack exchange,提问作者Dominick Munson
相关产品推荐
相关产品推荐

