如何使用Pandas筛选DataFrame中每第2或第3个唯一id对应的所有行
实现方法
核心逻辑
你已经提前将DataFrame按id排序,我们只需要给每个唯一的id按出现顺序分配统一的序号,再按步长筛选对应序号的所有行即可:
- 用
groupby('id').ngroup()给每个唯一id分配从0开始的连续序号,加1后转为从1开始的计数,相同id的所有行序号完全一致 - 按你需要的步长
n(n=2对应每第2个,n=3对应每第3个),筛选序号 % n == 1的行即可
完整代码
import pandas as pd # 注意原变量名id是Python内置函数,这里重命名为id_list避免冲突 id_list = ['11', '11', '11', '15', '15', '15', '23', '23', '25'] username = ['usera','userb','userc','userd','usere','userf','userd','usere','userf'] 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'] df = pd.DataFrame({'id': id_list, 'username': username, 'date': date}) dx = df.sort_values(by=['id'], ignore_index=True) # 给唯一id分配从1开始的顺序编号 dx['id_rank'] = dx.groupby('id').ngroup() + 1 # 筛选每第2个唯一id的所有行 n = 2 res_n2 = dx[dx['id_rank'] % n == 1].drop(columns='id_rank') print("每第2个唯一id的结果:") print(res_n2) # 筛选每第3个唯一id的所有行 n = 3 res_n3 = dx[dx['id_rank'] % n == 1].drop(columns='id_rank') print("\n每第3个唯一id的结果:") print(res_n3)
输出验证
运行后输出和你给出的预期完全匹配:
- n=2时保留id为11、23的所有行
- n=3时保留id为11、25的所有行
内容的提问来源于stack exchange,提问作者DanyJ
相关产品推荐
相关产品推荐

