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

如何在Pandas中基于日期为非重复组生成递增计数序列

按规则生成DataFrame计数列

问题背景

原始DataFrame:

id   date               day
A    01/01/2023 00:00   01
A    01/01/2023 00:00   01
B    01/01/2023 01:00   01
B    01/01/2023 01:00   01
A    01/01/2023 02:00   01
A    02/01/2023 00:00   02

期望输出:

id   date               day  count
A    01/01/2023 00:00   01   1   
A    01/01/2023 00:00   01   1   (两行均为1,因属于同一组)
B    01/01/2023 01:00   01   1   (为1,因ID不同)
B    01/01/2023 01:00   01   1
A    01/01/2023 02:00   01   2   (递增,因发生在同一天)
A    02/01/2023 00:00   02   1  (为1,因日期已变更)

核心规则

  • 分组依据为id、date、day,且DataFrame已按id和date排序
  • 同一(id, date, day)分组内所有行的count保持为1
  • 同一id、同day但不同date(时间分组)时,count按顺序递增
  • 不同id或不同day时,count重置为1

实现代码

import pandas as pd

# 构造示例数据
data = {
    'id': ['A', 'A', 'B', 'B', 'A', 'A'],
    'date': ['01/01/2023 00:00', '01/01/2023 00:00', '01/01/2023 01:00', '01/01/2023 01:00', '01/01/2023 02:00', '02/01/2023 00:00'],
    'day': ['01', '01', '01', '01', '01', '02']
}
df = pd.DataFrame(data)

# 1. 对每个(id, day)组内的不同date分组进行编号
df['temp_group'] = df.groupby(['id', 'day'])['date'].transform(lambda x: x.factorize()[0] + 1)

# 2. 确保同一(id, date, day)分组内count值一致
df['count'] = df.groupby(['id', 'date', 'day'])['temp_group'].transform('first')

# 移除临时列,输出结果
print(df.drop('temp_group', axis=1))

代码逻辑说明

  1. 分组编号:通过groupby(['id', 'day'])和factorize(),为每个用户每天内的不同时间分组生成从1开始的递增编号
  2. 统一分组内值:再按(id, date, day)分组取第一个编号,保证同一细分分组内所有行的count值相同
  3. 清理输出:删除临时列后得到符合要求的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:05:29