【问题标题】:Randomly Sample Pyspark dataframe with column conditions使用列条件随机采样 Pyspark 数据帧
【发布时间】:2019-10-18 00:40:28
【问题描述】:

我正在尝试对列值满足特定条件的 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|
+---+----+------+-------------+------+

我想根据result 列仅对0, 1, 2, 3 中的每一个进行采样(或任何一定数量),所以我最终会得到这个:

+---+----+------+-------------+------+
| 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|
+---+----+------+-------------+------+

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

【问题讨论】:

    标签: python random pyspark pyspark-sql pyspark-dataframes


    【解决方案1】:

    您可以使用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|
    +------+-----+
    

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 1970-01-01
      • 2020-07-04
      • 2019-11-18
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多