如何为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
相关产品推荐
相关产品推荐

