使用任何方法

On use of any method

一段来自 Kaggle 的代码,据说可以去除大纲:

outliers_mask = (ft.abs() > ft.abs().quantile(outl_thresh)).any(axis=1)

Any return 不是布尔值吗?一个项目是否在列表中? 那么代码说的是,将 Ft 中高于分位数(由另一个变量引入)的所有绝对值保存在掩码中? Any 代表什么?做什么的?谢谢。

我认为第一部分 return DataFrame 由布尔值填充 True or/and False:

(ft.abs() > ft.abs().quantile(outl_thresh))

so 添加了 DataFrame.any 用于测试是否每行至少有一个 True 到布尔值 Series.

df = pd.DataFrame({'a':[False, False, True],
                   'b':[False, True, True],
                   'c':[False, False, True]})
                        
print (df)
       a      b      c
0  False  False  False
1  False   True  False
2   True   True   True

print (df.any(axis=1))
0    False <- no True per rows
1     True <- one True per rows
2     True <- three Trues per rows
dtype: bool

如果所有值都是 Trues 的类似测试方法是 DataFrame.all:

print (df.all(axis=1))
0    False
1    False
2     True
dtype: bool

原因是通过 boolean indexing 过滤是必需的布尔系列,而不是布尔数据帧。

另一个示例数据:

np.random.seed(2021) 

ft = pd.DataFrame(np.random.randint(100, size=(10, 5))).sub(20)
print (ft)
    0   1   2   3   4
0  65  37 -20  74  66
1  24  42  71   9   1
2  73   4  -8  50  50
3  13 -13 -19  77   6
4  46  28  79  43  29
5  -4  30  34  32  73
6 -15  29  18  -6  51
7  65  50  21   1   5
8 -10  16  -1  37  62
9  70  -5  20  56  33

outl_thresh = 0.95

print (ft.abs().quantile(outl_thresh))
0    71.65
1    46.40
2    75.40
3    75.65
4    69.85
Name: 0.95, dtype: float64

print((ft.abs() > ft.abs().quantile(outl_thresh)))
       0      1      2      3      4
0  False  False  False  False  False
1  False  False  False  False  False
2   True  False  False  False  False
3  False  False  False   True  False
4  False  False   True  False  False
5  False  False  False  False   True
6  False  False  False  False  False
7  False   True  False  False  False
8  False  False  False  False  False
9  False  False  False  False  False

outliers_mask = (ft.abs() > ft.abs().quantile(outl_thresh)).any(axis=1)
print (outliers_mask)
0    False
1    False
2     True
3     True
4     True
5     True
6    False
7     True
8    False
9    False
dtype: bool

df1 = ft[outliers_mask]
print (df1)
    0   1   2   3   4
2  73   4  -8  50  50
3  13 -13 -19  77   6
4  46  28  79  43  29
5  -4  30  34  32  73
7  65  50  21   1   5
    0   1   2   3   4
    
df2 = ft[~outliers_mask]
print (df2)
    0   1   2   3   4
0  65  37 -20  74  66
1  24  42  71   9   1
6 -15  29  18  -6  51
8 -10  16  -1  37  62
9  70  -5  20  56  33