我正在嘗試為每行生成一個帶有亂數的列,但該數字必須在現有列和-1之間的范圍內。如果我有:
customer existing_value
A -15
B -9
C -13
我想收到類似的東西rand(existing_value, -1):
customer existing_value random_value
A -15 -3
B -9 -8
C -13 -6
我找不到專門的 PySpark 解決方案,sqlrand()功能似乎太有限了。我嘗試使用以下代碼,但該函式不接受列作為輸入:
random_month.withColumn('random', randint(col('existing_value'), -1))
這里有什么好的解決方案?行數約為 100k,因此如果 PySpark 中沒有合適的內容,如有必要,可以選擇 pandas。
uj5u.com熱心網友回復:
您可以將randint函式與 UDF 一起使用:
from pyspark.sql import functions as F
df = spark.createDataFrame([("A", -15), ("B", -9), ("C", -13), ], ["customer", "existing_value"])
df1 = df.withColumn("random_value", F.udf(lambda x: randint(x, -1))("existing_value"))
df1.show()
# -------- -------------- ------------
#|customer|existing_value|random_value|
# -------- -------------- ------------
#| A| -15| -5|
#| B| -9| -7|
#| C| -13| -3|
# -------- -------------- ------------
另一種解決方案是生成一系列數字existing_value,-1然后從結果陣列中隨機選擇一個元素:
df1 = df.withColumn(
"random_value",
F.expr("sequence(existing_value, -1, 1)")
).withColumn(
"random_value",
F.col("random_value")[F.floor(F.rand() * F.size("random_value"))]
)
uj5u.com熱心網友回復:
使用 pandas 的 apply 函式對列進行此類操作:https ://pandas.pydata.org/docs/reference/api/pandas.DataFrame.apply.html 。一種可能的解決方案如下:
import pandas as pd
import random
df = pd.DataFrame([-15, -20], columns=['existing_value'])
df['random_value'] = df.existing_value.apply(lambda row: random.randint(row,-1))
print(df)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/418178.html
標籤:
上一篇:在Python中,從匯入的模塊執行緒初始化類變數是否安全?
下一篇:Spark:如何將間隔除以間隔
