如何高效判断验证集各列范围是否处于训练集对应列范围内?
高效验证数据集列范围是否完全包含于训练集的方法
先回顾下咱们的数据集和需求:
训练集(train):
>>> train A B 0 1 300 1 5 600 2 2 450
验证集(valid):
>>> valid A B 0 1500 300 1 4 600 2 2 450
需求是:对每一列判断验证集的数值范围是否完全被训练集的范围包含,即满足 max(valid[col]) <= max(train[col]) 且 min(valid[col]) >= min(train[col])。
当然有比逐列循环更优的方法!咱们可以利用pandas的向量化操作来一次性完成所有列的检查,这种方法不仅代码更简洁,运行效率也更高(尤其是数据集很大的时候)。
实现步骤
- 分别计算训练集和验证集每一列的最小值和最大值,用
agg()方法一次性聚合统计量; - 对每一列同时验证两个条件:验证集的最大值≤训练集最大值,且验证集最小值≥训练集最小值;
- 将结果整理成要求的DataFrame格式。
完整代码
import pandas as pd def func(train, valid): # 计算训练集和验证集的min/max统计量 train_stats = train.agg(['min', 'max']) valid_stats = valid.agg(['min', 'max']) # 验证条件:valid的max <= train的max 且 valid的min >= train的min result = (valid_stats.loc['max'] <= train_stats.loc['max']) & (valid_stats.loc['min'] >= train_stats.loc['min']) # 转换成要求的DataFrame格式 return pd.DataFrame(result).T
运行测试:
>>> func(train, valid) A B 0 False True
为什么这方法更优?
- 避免了手动循环,代码可读性更强;
- 利用pandas的向量化运算,底层是优化过的C实现,比Python级别的循环快得多,尤其是当列数很多或者数据集很大时,优势更明显;
- 逻辑清晰,统计量的计算和条件验证都可以一步到位。
内容的提问来源于stack exchange,提问作者Garvey
相关产品推荐
相关产品推荐

