将同一DataFrame上的每一列加倍的最佳实践

时间:2019-04-03 12:15:01

标签: python apache-spark pyspark apache-spark-sql

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

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

例如,以这个DF:

bar()

并使其如下:

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

最简单的方法如下:

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

但是,这需要很多时间。

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

非常感谢您!

1 个答案:

答案 0 :(得分:2)

您可以使用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])