如何判断测试DataFrame每行是否处于训练集各列极值范围内
问题与优化方案
问题背景
现有两个Pandas DataFrame:
import pandas as pd df_test = pd.DataFrame({ "col1": [1, 5, 6, 5], "col2": [4, 5, 6, 7], "col3": [5, 9, 10, 11], "col4": [11, 10, 10, 4], }) df_train = pd.DataFrame({ "col1": [3, 6, 7, 4, 4], "col2": [5, 10, 5, 5, 5], "col3": [6, 8, 9, 10, 6], "col4": [11, 10, 8, 12, 6], })
已通过以下代码计算得到训练集各列的极值:
df_train_minMax = df_train.agg([min, max])
结果为:
col1 col2 col3 col4 min 3 5 6 6 max 7 10 10 12
需求:
- 判断测试集每行所有值是否都处于训练集对应列的
[min, max]区间内,生成布尔值列表(全合规为True,否则为False) - 记录所有不符合条件的位置索引(行、列)
原实现代码存在无法动态匹配各列极值、逻辑冗余的问题,需优化。
优化实现方案
利用Pandas的矢量化操作可以高效完成需求,无需手动循环:
完整代码
import pandas as pd # 创建数据集 df_test = pd.DataFrame({ "col1": [1, 5, 6, 5], "col2": [4, 5, 6, 7], "col3": [5, 9, 10, 11], "col4": [11, 10, 10, 4], }) df_train = pd.DataFrame({ "col1": [3, 6, 7, 4, 4], "col2": [5, 10, 5, 5, 5], "col3": [6, 8, 9, 10, 6], "col4": [11, 10, 8, 12, 6], }) # 计算训练集各列极值 df_train_minMax = df_train.agg([min, max]) # 提取最小、最大值Series train_min = df_train_minMax.loc['min'] train_max = df_train_minMax.loc['max'] # 生成每个元素是否在区间内的布尔矩阵 mask = (df_test >= train_min) & (df_test <= train_max) # 生成每行的合规判断结果列表 row_valid = mask.all(axis=1).tolist() # 提取所有不合规的位置索引(行号、列号) invalid_indices = [(idx, df_test.columns.get_loc(col)) for idx, col in mask.stack()[~mask.stack()].index] print(row_valid) print(invalid_indices)
代码说明
- 动态匹配极值:直接从
df_train_minMax中取出min和max对应的Series,自动按列名匹配测试集,无需手动传入参数 - 矢量化比较:一次性生成测试集所有元素的合规性布尔矩阵,效率远高于嵌套循环
- 行级合规判断:
mask.all(axis=1)判断每行是否所有元素都合规,转成列表即为需求的布尔结果 - 提取不合规索引:
mask.stack()将二维矩阵转为Series,索引变为(行号, 列名)的多级索引~mask.stack()筛选出所有不合规的元素- 通过
df_test.columns.get_loc(col)将列名转为列编号,得到数字格式的(行,列)索引对
输出结果
[False, True, True, False] [(0, 0), (0, 1), (0, 3), (3, 2), (3, 3)]
与预期完全匹配。
内容的提问来源于stack exchange,提问作者edit02
相关产品推荐
相关产品推荐

