从具有低方差pyspark的数据框中删除多列

时间:2019-12-21 06:50:50

标签: pyspark bigdata feature-selection pyspark-dataframes

我有一个大数据框(250万行x 11000列)。我想删除方差低的列。我使用以下方法计算了方差:

df_stats = df.select(*[var_samp(c).alias(c) for c in df.columns])

然后我将df_stats保留在内存中: df_stats.cache()

要删除低方差列,我使用:

var_threshold = 0.005
cols_to_reject = []
for col in df_stats.columns:
        var_value = df_stats.select(col).collect()[0][0]
        if var_value < var_threshold:
              cols_to_reject.append(col)

df = df.drop(*cols_to_reject)

但是,此过程需要很多时间,并且永远不会完成。有办法更有效地做到这一点吗?告诉我列处理可以并行化。

示例数据集: df = +--+-------------------+--------------------+ |id| feature_1 | feature_2 | +--+-------------------+--------------------+ | 0| 0.7224977951905031| -0.1875348803463305| | 1| 0.2953174992603351|-0.26525647952450265| | 2| 0.4536856090041318| -0.7195024130068081| | 3| 0.9970412477032209| 0.5181478766595276| | 4|0.19657711634539565| 0.7316273979766378| | 5|0.48533720635534006| 0.07724879367590629| | 6| 0.7369825278894753| -0.5462256961278941| | 7| 0.5241113627472694| -0.2542275002421211| | 8| 0.2977697066654349| -0.5752237580095868| | 9| 0.5060159582230856| 1.0900096472044518| +--+-------------------+--------------------+ df_stats= +-------------------+--------------------+ | feature_1 | feature_2 | +-------------------+--------------------+ | 0.008 | 0.0287489 | +-------------------+--------------------+

0 个答案:

没有答案