我有一个大数据框(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 |
+-------------------+--------------------+