Python/Pandas下基于指定列条件的大型数据集欠采样实现方法
自定义规则欠采样高效实现方案
针对你需要基于「上一个保留点的状态判断是否保留当前点」的采样规则,以下两种方案性能远高于原生Python逐行遍历,数万行数据集可以在毫秒级完成处理:
方案1:Numba JIT编译实现(最优性能)
核心逻辑和你原本的逐行判断完全一致,通过Numba将代码编译为机器码运行,速度比原生遍历快100倍以上。
实现代码
import pandas as pd import numpy as np from numba import jit @jit(nopython=True) def filter_custom_rule(time_arr, temp_arr, time_threshold=1, temp_threshold=2): total_len = len(time_arr) keep_mask = np.zeros(total_len, dtype=np.bool_) # 首条数据默认保留 keep_mask[0] = True last_keep_time = time_arr[0] last_keep_temp = temp_arr[0] for idx in range(1, total_len): delta_time = time_arr[idx] - last_keep_time delta_temp = abs(temp_arr[idx] - last_keep_temp) if delta_time >= time_threshold or delta_temp >= temp_threshold: keep_mask[idx] = True last_keep_time = time_arr[idx] last_keep_temp = temp_arr[idx] return keep_mask # 调用示例 # 先将时间列转为秒级时间戳数值 df['time_stamp'] = df['time'].astype('int64') // 10**9 keep = filter_custom_rule(df['time_stamp'].values, df['temperature'].values) # 得到欠采样结果 result_df = df[keep].reset_index(drop=True)
适用场景
需要灵活扩展多维度判断规则、追求最高运行速度的场景,规则修改只需要调整函数内的判断逻辑即可。
方案2:Pandas原生向量化实现(无额外依赖)
不需要安装第三方库,全用Pandas原生方法实现,性能比原生遍历快几十倍。
实现代码
# 处理时间阈值条件,按1秒间隔分组 df['time_diff'] = df['time'].diff().dt.total_seconds().fillna(0) df['time_group'] = (df['time_diff'].cumsum() // 1).diff().ne(0).cumsum() # 处理温度阈值条件,按2℃变化间隔分组 df['temp_diff'] = df['temperature'].diff().abs().fillna(0) df['temp_group'] = (df['temp_diff'].cumsum() // 2).diff().ne(0).cumsum() # 取每个时间/温度分组的第一条数据即为符合要求的采样点 result_df = df.groupby(['time_group', 'temp_group'], as_index=False).first() # 清理临时列 result_df = result_df.drop(columns=['time_diff', 'time_group', 'temp_diff', 'temp_group'])
适用场景
不想安装额外依赖、规则相对固定的场景。
注意事项
- 运行前需要确保
time列已经转换为Pandas的datetime64类型,避免时间差计算错误。 - 阈值可以根据实际需求自由调整,不需要修改核心逻辑。
内容的提问来源于stack exchange,提问作者Benjamin Hennequart
相关产品推荐
相关产品推荐

