使用列条件随机采样 Pyspark 数据帧

mle*_*ast 5 python random apache-spark-sql pyspark

我正在尝试随机采样 Pyspark 数据帧,其中列值满足特定条件。我想使用该sample方法根据列值随机选择行。假设我有以下数据框:

+---+----+------+-------------+------+
| id|code|   amt|flag_outliers|result|
+---+----+------+-------------+------+
|  1|   a|  10.9|            0|   0.0|
|  2|   b|  20.7|            0|   0.0|
|  3|   c|  30.4|            0|   1.0|
|  4|   d| 40.98|            0|   1.0|
|  5|   e| 50.21|            0|   2.0|
|  6|   f|  60.7|            0|   2.0|
|  7|   g|  70.8|            0|   2.0|
|  8|   h| 80.43|            0|   3.0|
|  9|   i| 90.12|            0|   3.0|
| 10|   j|100.65|            0|   3.0|
+---+----+------+-------------+------+
Run Code Online (Sandbox Code Playgroud)

我想0, 1, 2, 3根据该result列仅对每个样本中的 1 个(或任何特定数量)进行采样,因此我最终会得到以下结果:

+---+----+------+-------------+------+
| id|code|   amt|flag_outliers|result|
+---+----+------+-------------+------+
|  1|   a|  10.9|            0|   0.0|
|  3|   c|  30.4|            0|   1.0|
|  5|   e| 50.21|            0|   2.0|
|  8|   h| 80.43|            0|   3.0|
+---+----+------+-------------+------+

Run Code Online (Sandbox Code Playgroud)

是否有一个好的编程方法来实现这一点,即为某一列中给出的每个值采用相同的行数?非常感谢任何帮助!

pis*_*all 4

您可以使用sampleBy()它返回分层样本,而无需根据每个层给出的分数进行替换。

>>> from pyspark.sql.functions import col
>>> dataset = sqlContext.range(0, 100).select((col("id") % 3).alias("result"))
>>> sampled = dataset.sampleBy("result", fractions={0: 0.1, 1: 0.2}, seed=0)
>>> sampled.groupBy("result").count().orderBy("key").show()

+------+-----+
|result|count|
+------+-----+
|     0|    5|
|     1|    9|
+------+-----+
Run Code Online (Sandbox Code Playgroud)