我想取一个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])