如何从数据集中过滤非常稀疏的要素

时间:2016-12-13 18:16:38

标签: python pandas numpy scipy sparse-matrix

我尝试预处理数据集,并且我想通过设置一个阈值来删除非常稀疏的列,以便将删除值小于具有小于阈值的条目的列。

下面的代码应该完成工作,但我不明白它是如何工作的,请帮助解释或建议我如何完成这项工作。谢谢!

sparse_col_idx = ((x_sparse > 0).mean(0) > 0.05).A.ravel()

x_sparse的暗淡为(12060,272776)

1 个答案:

答案 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