Pandas中如何保留a、b对的指定重复次数观测值并移除超额项
解决Pandas中按指定列配对保留最多N条重复项的问题
问题场景
现有如下结构的Pandas DataFrame:
a b c 0 1 2 3 1 1 2 3 ...
需求:针对a、b列的配对值,最多保留100个重复项。例如当a=1且b=2的配对出现200次时,仅保留其中100次。尝试在GroupBy后的DataFrame上使用duplicated()方法无法实现该需求。
解决方案
可以利用groupby()结合cumcount()方法实现精准控制每个分组的保留行数,具体代码如下:
简洁版(无需新增列)
# 直接筛选出每个a、b配对的前100条记录 result_df = df[df.groupby(['a', 'b']).cumcount() < 100]
分步版(更易理解)
# 1. 按a、b分组,为每个分组内的行添加从0开始的计数序号 df['group_seq'] = df.groupby(['a', 'b']).cumcount() # 2. 筛选出序号小于100的行,即保留每个配对的前100条 result_df = df[df['group_seq'] < 100].drop(columns='group_seq')
原理说明
cumcount()会为每个分组内的行生成从0开始的递增序号,通过筛选序号小于100的行,就能保证每个a、b配对最多保留100条记录。这种方式比duplicated()更适合这类需要控制重复项保留数量的场景——duplicated()仅能标记是否为重复项,无法指定保留的重复次数上限。
内容的提问来源于stack exchange,提问作者CutePoison
相关产品推荐
相关产品推荐

