如何在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))
代码逻辑说明
- 分组编号:通过
groupby(['id', 'day'])和factorize(),为每个用户每天内的不同时间分组生成从1开始的递增编号 - 统一分组内值:再按
(id, date, day)分组取第一个编号,保证同一细分分组内所有行的count值相同 - 清理输出:删除临时列后得到符合要求的结果
内容的提问来源于stack exchange,提问作者python_interest
相关产品推荐
相关产品推荐

