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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:15:31