如何在Pandas DataFrame中保留间隔至少4行的1值?
解决保留间隔至少4行的1值问题
核心思路
我们需要确保每一个保留的1,和上一个被保留的1的索引差至少为4(对应间隔至少4行)。直接用diff()处理相邻1的间隔会误判连续或近邻的有效1(比如示例中索引4的1应该保留,但它和索引3的1相邻,diff()无法区分这种情况),因此直接追踪上一个保留的1的位置,逐个判断是否满足间隔要求是更可靠的方案。
实现代码
import pandas as pd # 初始化示例数据 df = pd.DataFrame.from_dict({'ix':list(range(12)), 'in':[1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]}) # 收集需要保留的1的索引 keep_indices = [] last_kept_idx = -float('inf') # 初始化为负无穷,确保第一个1会被保留 # 遍历所有值为1的行索引 for idx in df[df['in'] == 1].index: # 检查当前索引与上一个保留索引的间隔是否≥4 if idx - last_kept_idx >= 4: keep_indices.append(idx) last_kept_idx = idx # 生成输出列 df['out'] = 0 df.loc[keep_indices, 'out'] = 1 print(df)
输出验证
运行后得到的out列与示例期望完全一致:
ix in out 0 0 1 1 1 1 0 0 2 2 0 0 3 3 1 0 4 4 1 1 5 5 0 0 6 6 1 0 7 7 0 0 8 8 1 1 9 9 0 0 10 10 0 0 11 11 1 0
逻辑说明
- 先筛选出所有值为1的行索引,避免遍历整个数据集提升效率;
- 用
last_kept_idx记录上一个被保留的1的索引,初始值设为负无穷保证第一个1一定会被保留; - 对每个1的索引,判断与上一个保留索引的差值是否≥4,满足则标记为保留并更新
last_kept_idx; - 最后将保留的索引对应的
out列设为1,其余为0。
这个方法逻辑直观,容易根据需求调整间隔阈值(比如把4改成其他数值),同时不会出现diff()方法误删有效1的问题。
内容的提问来源于stack exchange,提问作者Baron Yugovich
相关产品推荐
相关产品推荐

