Умножить столбец данных PySpark со скалярным - PullRequest
0 голосов
/ 18 октября 2019

Я хочу умножить столбец (скажем, x3) фрейма данных PySpark (скажем, df) на скаляр (скажем, 0.1). Ниже приведен пример имеющегося у меня фрейма данных:

df = sqlContext.createDataFrame(
    [(1, "a", 1551.0), (3, "B", 1925.0)], ("x1", "x2", "x3"))

df.show()

+---+---+----+
| x1| x2|  x3|
+---+---+----+
|  1|  a| 5.0|
|  3|  B|21.0|
+---+---+----+

Ниже приводится то, что я пытаюсь сделать в данный момент:

df_new = df.withColumn( "norm_x3", 0.1*F.col( "x3") )
df_new = df_new.select( [c for c in df_new.columns if c not in {'x3'}] )

Метод, который я пробую выше, дает ожидаемый результат, которыйэто:

+---+---+-------+
| x1| x2|norm_x3|
+---+---+-------+
|  1|  a|    0.5|
|  3|  B|    2.1|
+---+---+-------+

Есть ли более элегантный и короткий способ сделать то же самое? Спасибо.

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Самый элегантный способ - просто использовать drop:

df_new = df.withColumn("norm_x3", 0.1*F.col( "x3")).drop("x3")

В качестве альтернативы вы также можете использовать withColumnRenamed, но это менее предпочтительно, потому что вы перегружаете "x3" и можете вызвать путаницув будущем:

df_new = df.withColumn("x3", 0.1*F.col( "x3")).withColumnRenamed("x3", "norm_x3")
1 голос
/ 18 октября 2019

Вот один из способов сделать это в одной строке:

df.select([(df[c] * 0.1).alias('norm_x3') if c == 'x3' else df[c] for c in df.columns]

Или:

df.selectExpr('*', 'x3 * 0.1 as normal_x3').drop('x3')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...