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

