我尝试预处理数据集,并且我想通过设置一个阈值来删除非常稀疏的列,以便将删除值小于具有小于阈值的条目的列。
下面的代码应该完成工作,但我不明白它是如何工作的,请帮助解释或建议我如何完成这项工作。谢谢!
sparse_col_idx = ((x_sparse > 0).mean(0) > 0.05).A.ravel()
x_sparse的暗淡为(12060,272776)
答案 0 :(得分:1)
让我们把它分解为几步。假设x_sparse是一个DataFrame,那么x_sparse > 0
将返回一个具有相同精确尺寸,索引和列的DataFrame,每个值基于给定的条件为True或False(这里是值> 0的地方)
.mean(0)
这取每列的平均值。由于False的计算结果为0而True计算为1,因此mean()
返回符合条件的列的百分比。此时您将进入一个系列,其中列名称是索引,值是符合条件的百分比。
> 0.05
现在,这会将之前的系列更改为与符合条件的列名匹配的一系列布尔值。
.A.ravel()
这看起来没必要。我将在下面提供一个简单的示例来说明步骤。
创建具有随机正常值的DataFrame
np.random.seed(3)
x_sparse = pd.DataFrame(data=np.random.randn(100, 5), columns=list('abcde'))
print(x_sparse.head())
输出:
a b c d e
0 1.788628 0.436510 0.096497 -1.863493 -0.277388
1 -0.354759 -0.082741 -0.627001 -0.043818 -0.477218
2 -1.313865 0.884622 0.881318 1.709573 0.050034
3 -0.404677 -0.545360 -1.546477 0.982367 -1.101068
4 -1.185047 -0.205650 1.486148 0.236716 -1.023785
# the argument 0 is unnecessary. The default is get average of columns
(x_sparse > 0).mean()
输出
a 0.48
b 0.52
c 0.44
d 0.55
e 0.45
# create a threshold
threshold = .5
(x_sparse > 0).mean() > threshold
输出
a False
b True
c False
d True
e False
保留特定列
threshold = .5
keep = (x_sparse > 0).mean() > threshold
x_sparse[x_sparse.columns[keep]]
输出
b d
0 0.436510 -1.863493
1 -0.082741 -0.043818
2 0.884622 1.709573
3 -0.545360 0.982367
4 -0.205650 0.236716