【问题标题】:How to count the median, mean and percentile of all columns together and not separately using pySpark?如何使用pySpark一起计算所有列的中位数、平均值和百分位数,而不是单独计算?
【发布时间】:2022-07-06 17:49:22
【问题描述】:

我有一个文本文件的问题:

1   -0.087  0.019   -0.01   -0.046  -0.091  0.045
2   0.049   0.069   0.043   0.072   -0.021  -0.064
3   0.077   -0.079  -0.06   -0.021  -0.019  -0.096
4   0.026   0.07    -0.07   -0.035  0.072   0.088
5   0.038   0.046   -0.037  -0.008  0.03    0.091
6   0.005   0.032   -0.086  -0.038  0.091   0.023
7   0.038   0.046   -0.037  -0.008  0.03    0.091
8   0.005   0.032   -0.086  -0.038  0.091   0.023
9   0.052   0.022   -0.017  -0.006  -0.022  -0.059
10  -0.095  0.061   -0.042  0.057   0.012   0.023

里面有好几列。 通常,该方案看起来像第一列是标识符 (ID),随后的每一列都是数字。我想一起计算所有列的中位数、平均值和百分位数,而不是单独使用 pySpark。不幸的是,我不知道该怎么做。我可以单独计算每一列,但不能一起计算。

谁能给我一些建议?

【问题讨论】:

  • 你试过df.summary()吗?

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

第一个问题是列值之间的空格数在不同行之间是不同的,这使得将文件读入数据帧变得复杂。

如果您将文件视为 csv 文件,分隔符默认为 ,,您会得到以下结果:

要分隔数值,可以试试:

df = (df
      .withColumn('values_separated', f.expr('filter(split(_c0, " "), element -> element != "")'))
     )

输出如下所示:

现在将“values_separated”数组中的值分成列:

df = (df
      .select(*[f.element_at(f.col('values_separated'), i).alias('col_' + str(i)) for i in range(1, 8)])
     )

然后运行汇总方法:

df.summary().show()

输出将是:

+-------+------------------+--------------------+--------------------+-------------------+--------------------+--------------------+--------------------+
|summary|             col_1|               col_2|               col_3|              col_4|               col_5|               col_6|               col_7|
+-------+------------------+--------------------+--------------------+-------------------+--------------------+--------------------+--------------------+
|  count|                10|                  10|                  10|                 10|                  10|                  10|                  10|
|   mean|               5.5|              0.0108|              0.0318|            -0.0402|-0.00710000000000...|0.017300000000000003|0.016499999999999997|
| stddev|3.0276503540974917|0.057807727280471184|0.042993022689734206|0.03925925227113844| 0.04050089162255841|0.057988600412303255|  0.0683036520904182|
|    min|                 1|              -0.087|              -0.079|              -0.01|              -0.006|              -0.019|              -0.059|
|    25%|               3.0|               0.005|               0.022|              -0.07|              -0.038|              -0.021|              -0.059|
|    50%|               5.0|               0.026|               0.032|             -0.042|              -0.021|               0.012|               0.023|
|    75%|               8.0|               0.049|               0.061|             -0.017|              -0.006|               0.072|               0.088|
|    max|                 9|               0.077|                0.07|              0.043|               0.072|               0.091|               0.091|
+-------+------------------+--------------------+--------------------+-------------------+--------------------+--------------------+--------------------+

【讨论】:

  • 在您的解决方案中,您计算​​了每列的统计信息,但我确实想一起计算数据集中所有值的统计信息,所以可能有六列的值应该连接在一起,但我不知道该怎么做将所有列视为一列,然后计算统计数据,你知道吗?
  • 您可以为每一列创建单独的数据框,将它们合并,然后对生成的数据框运行汇总方法
【解决方案2】:

解决方案

作为最后一种方法,我使用了@ARCrow 提出的解决方案。

我为每一列创建了单独的数据框。 之后,我将它们联合起来,然后为生成的数据帧运行 summary 方法。

【讨论】:

    猜你喜欢
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2019-05-20
    • 2017-12-03
    • 1970-01-01
    • 2022-12-13
    相关资源
    最近更新 更多