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

