我想采用 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()
来做到这一点。星号*
将取消列出
一个列表
。
例如; *['_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])
关于python - 将同一 DataFrame 上的每列加倍的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55494948/