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进行条件处理,然后从如上所述的项目列表中随机选取一个项目。你能帮我举一个完整的代码示例吗?