如何在pyspark中创建具有随机值的新列?

时间:2018-11-28 10:53:47

标签: python pandas pyspark

我尝试用pandas中的随机值初始化新列。我是这样

df['business_vertical'] = np.random.choice(['Retail', 'SME', 'Cor'], df.shape[0])

我如何在pyspark中做到这一点?

4 个答案:

答案 0 :(得分:5)

只需生成一个值列表,然后随机提取它们即可:

from pyspark.sql import functions as F

df.withColumn(
  "business_vertical",
  F.array(
    F.lit("Retail"),
    F.lit("SME"),
    F.lit("Cor"),
  ).getItem(
    (F.rand()*3).cast("int")
  )
)

答案 1 :(得分:1)

以下是通过quinn中的array_choice函数来解决此问题的方法:

import quinn

df = spark.createDataFrame([('a',), ('b',), ('c',)], ['letter'])
cols = list(map(lambda c: F.lit(c), ['Retail', 'SME', 'Cor']))
df.withColumn('business_vertical', quinn.array_choice(F.array(cols))).show()
+------+-----------------+
|letter|business_vertical|
+------+-----------------+
|     a|              SME|
|     b|           Retail|
|     c|              SME|
+------+-----------------+

array_choice是通用的,可以轻松地用于从现有ArrayType列中选择随机值。假设您具有以下DataFrame。

+------------+
|     letters|
+------------+
|   [a, b, c]|
|[a, b, c, d]|
|         [x]|
|          []|
+------------+

在这里,您可以获取随机字母。

actual_df = df.withColumn(
    "random_letter",
    quinn.array_choice(F.col("letters"))
)
actual_df.show()
+------------+-------------+
|     letters|random_letter|
+------------+-------------+
|   [a, b, c]|            a|
|[a, b, c, d]|            d|
|         [x]|            x|
|          []|         null|
+------------+-------------+

这是array_choice函数的定义:

def array_choice(col):
    index = (F.rand()*F.size(col)).cast("int")
    return col[index]

post详细说明了如何从PySpark数组中获取随机值。

答案 2 :(得分:0)

您可以使用pyspark.sql.functions.rand()

df.withColumn('rand_col', F.rand()).show()  

答案 3 :(得分:-1)

对于随机数:

import random
randomnum= random.randint(1000,9999)

numpy.random.choice

import org.apache.spark.sql.functions.lit
val newdf = df.withColumn("newcol",lit("your-random"))

或:pandas.Series.combine_first

s1 = pd.Series([1, np.nan])
s2 = pd.Series([3, 4])
s1.combine_first(s2)