我想取一个DF并将每列加倍(使用新的列名称)。

我想在我的ML模型(使用PySpark和Spark Pipeline实现)上进行“压力测试”,并查看如果我将输入数据集中的特征数量加倍/增加三倍,它的性能如何。

例如,使用此DF:

+-------+-------+-----+------+
|    _c0|    _c1|  _c2|   _c3|
+-------+-------+-----+------+
|   1   |Testing|     | true |
+-------+-------+-----+------+


并使其如下所示:

+-------+-------+-----+------+-------+-------+-----+------+
|    _c0|    _c1|  _c2|   _c3|    _c4|    _c5|  _c6|   _c7|
+-------+-------+-----+------+-------+-------+-----+------+
|   1   |Testing|     | true |   1   |Testing|     | true |
+-------+-------+-----+------+-------+-------+-----+------+


我最简单的方法是这样的:

df = df
doubledDF = df
for col in df.columns:
    doubledDF = doubledDF.withColumn(col+"1dup", df[col])


但是,这需要很多时间。

我将不胜感激任何解决方案,甚至更能解释为什么这种解决方案更好。

非常感谢你!

最佳答案

您可以使用selectExpr()进行此操作。星号*un-list一个list

例如*['_c0', '_c1', '_c2', '_c3']将返回'_c0', '_c1', '_c2', '_c3'

连同list-comprehensions的帮助,此代码可以被相当普遍地推广。

df = sqlContext.createDataFrame([(1,'Testing','',True)],('_c0','_c1','_c2','_c3'))
df.show()
+---+-------+---+----+
|_c0|    _c1|_c2| _c3|
+---+-------+---+----+
|  1|Testing|   |true|
+---+-------+---+----+

col_names = df.columns
print(col_names)
['_c0', '_c1', '_c2', '_c3']

df = df.selectExpr(*[i for i in col_names],*[i+' as '+i+'_dup' for i in col_names])
df.show()
+---+-------+---+----+-------+-------+-------+-------+
|_c0|    _c1|_c2| _c3|_c0_dup|_c1_dup|_c2_dup|_c3_dup|
+---+-------+---+----+-------+-------+-------+-------+
|  1|Testing|   |true|      1|Testing|       |   true|
+---+-------+---+----+-------+-------+-------+-------+


注意:以下代码也可以使用。

df = df.selectExpr('*',*[i+' as '+i+'_dup' for i in col_names])

10-05 23:18