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

如何为DataFrame按Unique_Id分组添加唯一短信递增计数器

为DataFrame按用户分组对唯一短信日期递增计数

问题场景

原始DataFrame:

Unique_Id          sms_sent_date         
A                    11-01-2022                   
A                    11-01-2022                   
A                    12-01-2022                   
A                    13-01-2022                   

B                    02-02-2022                   
B                    03-02-2022                   
B                    06-02-2022                   
B                    06-02-2022                   

需要新增unique_sms_counter列,实现每个Unique_Id分组内,对唯一的sms_sent_date进行递增计数,相同日期对应相同序号,最终结果如下:

Unique_Id          sms_sent_date         unique_sms_counter
A                    11-01-2022                   1
A                    11-01-2022                   1
A                    12-01-2022                   2
A                    13-01-2022                   3

B                    02-02-2022                   1
B                    03-02-2022                   2
B                    06-02-2022                   3
B                    06-02-2022                   3

尝试使用df.groupby(['Unique_Id','sms_sent_date']).cumcount()无法得到预期结果,因为该方法是对每个(Unique_Id, sms_sent_date)组内的行进行逐行计数,而非对唯一日期分配递增序号。

解决方案

方法1:使用rank方法(推荐)

利用groupby结合rank(method='dense'),可以对每个分组内的唯一日期进行密集递增排名,相同日期会得到同一个序号:

import pandas as pd

# 构造示例DataFrame
data = {
    'Unique_Id': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
    'sms_sent_date': ['11-01-2022', '11-01-2022', '12-01-2022', '13-01-2022',
                      '02-02-2022', '03-02-2022', '06-02-2022', '06-02-2022']
}
df = pd.DataFrame(data)

# 添加unique_sms_counter列
df['unique_sms_counter'] = df.groupby('Unique_Id')['sms_sent_date'].rank(method='dense').astype(int)

print(df)

方法2:先映射序号再合并

先提取每个分组内的唯一日期并分配序号,再通过合并将序号映射回原DataFrame:

# 生成每个Unique_Id下的日期-序号映射
date_rank = df.groupby('Unique_Id')['sms_sent_date'].unique().explode().reset_index()
date_rank['unique_sms_counter'] = date_rank.groupby('Unique_Id').cumcount() + 1

# 合并回原DataFrame
df = df.merge(date_rank, on=['Unique_Id', 'sms_sent_date'], how='left')

print(df)

两种方法都能得到预期的结果,其中方法1更简洁高效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:50:44