如何在Pandas中按分组排名,当月度间隔超1时重置排名?
解决用户连续组停留时长重置计数的问题
你的核心问题是:原代码将同一用户的同一组(非连续时间段)归为了同一个分组,导致返回旧组时排名不会重置。要实现连续同组时间段内计数从1开始,需要先给每个用户的连续同组周期生成独立标识,再基于这个标识计算停留时长。
具体实现代码
import pandas as pd # 原始数据 data = {'User_id':[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3], 'Group':[1,1,2,1,1,2,2,2,2,2,3,2,2,1,1], 'Date':['23-01-01','23-02-01','23-03-01','23-04-01','23-05-01', '23-01-01','23-02-01','23-03-01','23-04-01','23-05-01', '23-01-01','23-02-01','23-03-01','23-04-01','23-05-01']} df = pd.DataFrame.from_dict(data) # 1. 按用户和日期排序,确保时间顺序正确 df = df.sort_values(['User_id', 'Date']).reset_index(drop=True) # 2. 生成连续同组的标识:用户切换组时,标识递增 df['group_session'] = df.groupby('User_id')['Group'].apply(lambda x: x.ne(x.shift()).cumsum()) # 3. 基于用户+连续组标识,计算停留月份(cumcount从0开始,所以+1) df['Months_in_group'] = df.groupby(['User_id', 'group_session']).cumcount() + 1 # 查看结果 print(df[['User_id', 'Group', 'Date', 'Months_in_group']])
代码说明
x.ne(x.shift()):判断当前行的Group是否和上一行不同,返回布尔值(True/False).cumsum():将布尔值转为0/1后累加,生成每个连续组的唯一标识(比如用户1的两段Group1会被标记为1和3)cumcount() + 1:在每个连续组内从1开始计数,完美匹配你期望的结果
最终结果
运行后得到的Months_in_group列和你给出的期望结果完全一致,例如用户1回到Group1后,计数重新从1开始。
内容的提问来源于stack exchange,提问作者LeondenBoer
相关产品推荐
相关产品推荐

