分组 PySpark DataFrame 后如何应用描述函数?

Fav*_*uez 5 python apache-spark pyspark pyspark-sql

我想找到将describe函数应用于分组数据帧的最干净的方法(这个问题也可以扩展到将任何 DF 函数应用于分组的 DF)

我在没有运气的情况下测试了分组聚合 Pandas UDF。总有一种方法可以通过在agg函数内部传递每个统计信息来实现,但这不是正确的方法。

如果我们有一个示例数据框:

df = spark.createDataFrame(
    [(1, 1.0), (1, 2.0), (2, 3.0), (2, 5.0), (2, 10.0)],
    ("id", "v"))
Run Code Online (Sandbox Code Playgroud)

这个想法是做一些类似于 Pandas 的事情:

df.groupby("id").describe()
Run Code Online (Sandbox Code Playgroud)

结果是:

                                                   v
    count mean     std    min   25%    50%  75%   max
id                              
1   2.0   1.5   0.707107  1.0   1.25   1.5  1.75  2.0
2   3.0   6.0   3.605551  3.0   4.00   5.0  7.50  10.0
Run Code Online (Sandbox Code Playgroud)

谢谢。

All*_*ati 7

尝试这个:

df = (df
    .groupby("id")
    .agg(F.count('v').alias('count'),
         F.mean('v').alias('mean'),
         F.stddev('v').alias('std'),
         F.min('v').alias('min'),
         F.expr('percentile(v, array(0.25))')[0].alias('%25'),
         F.expr('percentile(v, array(0.5))')[0].alias('%50'),
         F.expr('percentile(v, array(0.75))')[0].alias('%75'),
         F.max('v').alias('max')))
df.show()
Run Code Online (Sandbox Code Playgroud)

输出:

+---+-----+----+------------------+---+----+---+----+----+
| id|count|mean|               std|min| %25|%50| %75| max|
+---+-----+----+------------------+---+----+---+----+----+
|  1|    2| 1.5|0.7071067811865476|1.0|1.25|1.5|1.75| 2.0|
|  2|    3| 6.0| 3.605551275463989|3.0| 4.0|5.0| 7.5|10.0|
+---+-----+----+------------------+---+----+---+----+----+
Run Code Online (Sandbox Code Playgroud)