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

Pandas按特殊规则保留每n行:遇指定条件重置计数

Pandas按特殊规则筛选DataFrame行

需求规则

  • 基础规则:保留每第3行;
  • 强制保留:所有能被3整除的数值所在行必须保留;
  • 重置逻辑:每当遇到能被3整除的数值时,立即重置计数,从该位置重新开始计数到3,期间若再次遇到符合条件的数值,重复重置。

示例数据与期望结果

原始数据

import pandas as pd
df = pd.DataFrame.from_dict({'x': [0, 1, 2, 3, 4, 5, 7, 8, 9, 11, 12, 13, 14, 17, 20, 23]})

输出:

x
0    0
1    1
2    2
3    3
4    4
5    5
6    7
7    8
8    9
9   11
10  12
11  13
12  14
13  17
14  20
15  23

期望筛选结果

filtered = pd.DataFrame.from_dict({'x': [0, 3, 7, 9, 12, 17]})

输出:

x
0   0
1   3
2   7
3   9
4  12
5  17

实现方案

方法1:迭代遍历(直观易懂)

逐行判断并维护计数变量,逻辑清晰适合小数据集:

import pandas as pd

df = pd.DataFrame.from_dict({'x': [0, 1, 2, 3, 4, 5, 7, 8, 9, 11, 12, 13, 14, 17, 20, 23]})

keep_mask = []
count = 0

for val in df['x']:
    if val % 3 == 0:
        keep_mask.append(True)
        count = 0
    else:
        count += 1
        if count == 2:
            keep_mask.append(True)
            count = 0
        else:
            keep_mask.append(False)

filtered = df[keep_mask].reset_index(drop=True)
print(filtered)

方法2:矢量化操作(高效适合大数据)

利用Pandas分组和累计计数功能,避免循环提升效率:

import pandas as pd

df = pd.DataFrame.from_dict({'x': [0, 1, 2, 3, 4, 5, 7, 8, 9, 11, 12, 13, 14, 17, 20, 23]})

# 标记能被3整除的行
div3_flag = df['x'] % 3 == 0
# 按能被3整除的行划分分组,每次触发时开启新分组
groups = div3_flag.cumsum()
# 每个分组内计算从0开始的行号
group_row_num = df.groupby(groups).cumcount()
# 筛选条件:要么是能被3整除的行,要么是分组内第3行(行号为2)
filter_mask = div3_flag | (group_row_num == 2)
filtered = df[filter_mask].reset_index(drop=True)
print(filtered)

两种方法均能得到符合预期的筛选结果。

内容的提问来源于stack exchange,提问作者Baron Yugovich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:15:56