Python实现随机删除Pandas DataFrame中不重叠n个连续行的方法
实现逻辑
- 先按照给定公式计算需要删除的连续行组数,同时做边界校验避免删除全部数据
- 每次随机选取一组不与已选区间重叠的连续n行起始索引
- 汇总所有待删除行索引后直接删除,保留原始DataFrame的索引格式
完整代码
import random import pandas as pd def remove_n_consecutive_rows(df_in, n, percent): # 异常参数直接返回原数据副本 if n <= 0 or percent <= 0 or len(df_in) < n: return df_in.copy() total_len = len(df_in) # 按公式计算待删除组数 k = round(percent * total_len / n) # 限制最大可删除组数,避免删空所有数据 max_possible_k = (total_len - 1) // n k = min(k, max_possible_k) if k == 0: return df_in.copy() drop_indices = set() # 初始化所有合法的连续n行起始索引 available_starts = list(range(total_len - n + 1)) for _ in range(k): # 随机选取一个起始位置 selected_start = random.choice(available_starts) # 把当前组的所有行加入待删除集合 drop_indices.update(range(selected_start, selected_start + n)) # 过滤掉所有和当前组重叠的起始位置,保证后续选取的区间不重叠 available_starts = [s for s in available_starts if s < selected_start - n + 1 or s > selected_start + n - 1] # 删除指定行,保留原始索引 return df_in.drop(drop_indices)
调用示例
以你提供的20行测试数据为例,调用remove_n_consecutive_rows(df, n=3, percent=0.3),即可生成删除2组3个连续行的结果,和你给出的输出示例效果一致。
内容的提问来源于stack exchange,提问作者Fruity Fritz
相关产品推荐
相关产品推荐

