Python 用列表中的随机项替换pyspark dataframe列中的某个组

Python 用列表中的随机项替换pyspark dataframe列中的某个组,python,apache-spark,random,pyspark,Python,Apache Spark,Random,Pyspark,假设数据帧如下所示: ls = [ ['1', -9.78], ['2', 5.38], ['1', 8.86], ['2', -0.47], ['1', -0.19], ['1', 4.78], ['1', -9.23], ['2', -89.32] ] test = spark.createDataFrame(pd.DataFrame(ls, columns=['col1', 'col2'])) test.show() +--

假设数据帧如下所示:

ls = [
    ['1', -9.78],
    ['2', 5.38],
    ['1', 8.86],
    ['2', -0.47],
    ['1', -0.19],
    ['1', 4.78],
    ['1', -9.23],
    ['2', -89.32]
]
test = spark.createDataFrame(pd.DataFrame(ls, columns=['col1', 'col2']))
test.show()
+----+------+
|col1|  col2|
+----+------+
|   a| -9.78|
|   2|  5.38|
|   a|  8.86|
|   2| -0.47|
|   c| -0.19|
|   b|  4.78|
|   a| -9.23|
|   2|-89.32|
+----+------+
输出:

+----+------+
|col1|  col2|
+----+------+
|   1| -9.78|
|   2|  5.38|
|   1|  8.86|
|   2| -0.47|
|   1| -0.19|
|   1|  4.78|
|   1| -9.23|
|   2|-89.32|
+----+------+
我想将col1==1的所有行替换为从项目列表中随机选取的:['a','b','c'](替换)

例如,结果如下所示:

ls = [
    ['1', -9.78],
    ['2', 5.38],
    ['1', 8.86],
    ['2', -0.47],
    ['1', -0.19],
    ['1', 4.78],
    ['1', -9.23],
    ['2', -89.32]
]
test = spark.createDataFrame(pd.DataFrame(ls, columns=['col1', 'col2']))
test.show()
+----+------+
|col1|  col2|
+----+------+
|   a| -9.78|
|   2|  5.38|
|   a|  8.86|
|   2| -0.47|
|   c| -0.19|
|   b|  4.78|
|   a| -9.23|
|   2|-89.32|
+----+------+

我是Pyspark的新手,对于何时使用诸如when()、where()、withColumn()、select()等操作,我感到非常困惑。我已经在这个网站上搜索过了,但我找不到我问题的答案,所以我真的希望有人能帮我

您可以定义一个函数,从列表中随机选取一个值。使用可以生成0到1之间的统一随机数。根据所选随机值的值,可以从列表中选择索引

例如,在您的情况下,列表中有3项:

  • 如果随机数小于1/3,则选择
    'a'
  • 如果随机数小于2/3,则选择
    'b'
  • 否则选择
    'c'
以下是一个函数,可用于将其推广到任何长度的拾取列表:

从pyspark.sql.functions导入rand,当
def pickRandomValue():
选择列表=['a'、'b'、'c']
N=len(选取列表)
r=rand()

c=when(r您可以使用
pyspark.sql.functions.rand()
,但有两个注意事项。1)列不能是混合类型,因此必须强制转换
col1
才能成为
StringType()
。2) 每次执行操作时都会重新计算随机数,因此除非设置种子(或写入磁盘),否则每次都会有随机结果。@pault谢谢您的评论,我已经在代码中进行了强制转换(本例中没有)。尽管我知道pyspark.sql.functions.rand()的存在,但我仍在努力对col1进行条件处理,然后从如上所述的项目列表中随机选取一个项目。你能帮我举一个完整的代码示例吗?