【发布时间】:2021-01-26 11:10:00
【问题描述】:
来自 Kaggle 的代码,据说可以删除轮廓:
outliers_mask = (ft.abs() > ft.abs().quantile(outl_thresh)).any(axis=1)
不会返回一个布尔值吗?一个项目是否在列表中? 那么代码所说的是,将 Ft 中高于分位数(由另一个变量引入)的所有绝对值保存在掩码中? Any 代表什么?做什么的?谢谢。
【问题讨论】:
来自 Kaggle 的代码,据说可以删除轮廓:
outliers_mask = (ft.abs() > ft.abs().quantile(outl_thresh)).any(axis=1)
不会返回一个布尔值吗?一个项目是否在列表中? 那么代码所说的是,将 Ft 中高于分位数(由另一个变量引入)的所有绝对值保存在掩码中? Any 代表什么?做什么的?谢谢。
【问题讨论】:
我认为第一部分返回由布尔值True 或/和False 填充的DataFrame:
(ft.abs() > ft.abs().quantile(outl_thresh))
添加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
【讨论】: