如何使用Python Pandas按用户分组提取每个用户的第2、第3个唯一ID
解决方案
核心思路是先按用户名分组提取每个用户的唯一id列表,按指定步长筛选后再匹配回原表获取所有对应行,完整实现代码如下:
import pandas as pd import numpy as np # 原始数据构造 id_list = ['11', '11', '11', '15', '15', '15', '23', '23', '25','25','26','26','27','27','27','28','28'] username = ['usera','usera','usera','usera','usera','usera','usera','usera','usera','usera','userb','userb','userb','userb','userb','userb','userb'] date = ['2021-05-04','2021-05-05','2021-05-05','2021-05-06','2021-06-07','2021-06-08','2021-07-09','2021-03-09','2021-04-10','2021-04-10','2021-04-10','2021-04-10','2021-04-10','2021-04-10','2021-04-10','2021-04-10','2021-04-10'] df = pd.DataFrame({'id': id_list, 'username': username, 'date': date}) # 先按用户名+id排序,保证每个用户下的id顺序稳定 df = df.sort_values(by=['username', 'id'], ignore_index=True) # 自定义步长:取每第2个设为2,取每第3个设为3,可按需调整 step = 2 # 方法1:循环实现,逻辑清晰易调整 selected_ids = [] for user, group in df.groupby('username'): # 获取当前用户的唯一id并排序 user_unique_ids = sorted(group['id'].unique()) # 按步长筛选id,::step表示从第1个开始每step个取1个 selected = user_unique_ids[::step] selected_ids.extend(selected) # 从原表中筛选出所有符合条件的行 result_df = df[df['id'].isin(selected_ids)].reset_index(drop=True) # 查看结果的id列,和需求完全匹配 print(result_df['id'].tolist()) # 输出:['11', '11', '11', '23', '23', '26', '26', '28', '28']
如果更习惯pandas链式操作,可以用下面的简洁写法:
# 方法2:链式操作,无需显式循环 result_df = ( # 先提取每个用户的唯一id行 df.groupby(['username', 'id']).head(1) # 按用户分组后按步长取id .groupby('username').nth(list(range(0, 1000, step))) # 匹配回原表获取所有对应行 .merge(df, on=['username', 'id'], how='left') # 保留原始列顺序 [['id', 'username', 'date']] .reset_index(drop=True) )
内容的提问来源于stack exchange,提问作者Sql4Life
相关产品推荐
相关产品推荐

