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

Pandas DataFrame实现删除后续n行内重复值并保留首行的方法

实现方案

核心逻辑

遍历行的同时维护每个值最后一次被保留的索引位置,判断当前行是否满足保留条件:只有当前值和上一次同值保留行的间隔超过n时,才保留当前行,否则标记为删除。

代码实现

1. 直接过滤删除重复行的版本

import pandas as pd

# 原始数据
df = pd.DataFrame({'value':[1,1,2,2,1,1,1,1,1,2,1,1]})

def drop_dup_in_n_window(df, target_col, n):
    # 存储每个值最后一次被保留的行索引
    last_keep_idx = {}
    # 存储每行是否保留的标记
    keep_mask = []
    for idx, val in df[target_col].items():
        if val not in last_keep_idx or idx - last_keep_idx[val] > n:
            keep_mask.append(True)
            last_keep_idx[val] = idx
        else:
            keep_mask.append(False)
    # 过滤保留行并重置索引
    return df[keep_mask].reset_index(drop=True)

# 测试n=5的情况
result = drop_dup_in_n_window(df, 'value', n=5)
print(result)

运行输出结果:

value
0      1
1      2
2      1
3      2

和要求的过滤结果完全一致。

2. 保留x标记的版本

如果需要和示例一样生成带x标记的DataFrame,可以用下面的函数:

def mark_dup_in_n_window(df, target_col, n):
    last_keep_idx = {}
    res_list = []
    for idx, val in df[target_col].items():
        if val not in last_keep_idx or idx - last_keep_idx[val] > n:
            res_list.append(val)
            last_keep_idx[val] = idx
        else:
            res_list.append('x')
    return df.assign(**{target_col: res_list})

# 测试n=5的情况
marked_df = mark_dup_in_n_window(df, 'value', n=5)
print(marked_df)

运行输出结果和给出的示例完全一致:

value
0      1
1      x
2      2
3      x
4      x
5      x
6      1
7      x
8      x
9      2
10     x
11     x

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:36:05