Лучшая практика для дублирования каждого столбца на одном и том же фрейме данных - PullRequest
1 голос
/ 03 апреля 2019

Я хочу взять 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])

Однако, это занимает много времени.

Буду признателен за любое решение,и еще больше объяснений, почему этот подход к решению лучше.

Большое спасибо!

1 Ответ

2 голосов
/ 03 апреля 2019

Вы можете сделать это, используя selectExpr(). Звездочка * будет un-list a 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])
...