Python 使用PySpark的SAS Proc Freq(频率、百分比、累积频率和累积百分比)

Python 使用PySpark的SAS Proc Freq(频率、百分比、累积频率和累积百分比),python,apache-spark,pyspark,statistics,cumulative-frequency,Python,Apache Spark,Pyspark,Statistics,Cumulative Frequency,我正在寻找一种在PySpark中重现SAS Proc Freq代码的方法。我找到了。然而,它是在大熊猫中给予的。 我想确保它确实使用了Spark所能提供的最佳功能,因为代码将使用大量数据集运行。(),我还在PySpark中找到了计算分布式分组累积和的说明,但不知道如何使其适应我的目的 下面是一个输入和输出示例(我的原始数据集将有几十亿行): 输入数据集: state 0 Delaware 1 Delaware 2 Delaware 3

我正在寻找一种在PySpark中重现SAS Proc Freq代码的方法。我找到了。然而,它是在大熊猫中给予的。 我想确保它确实使用了Spark所能提供的最佳功能,因为代码将使用大量数据集运行。(),我还在PySpark中找到了计算分布式分组累积和的说明,但不知道如何使其适应我的目的

下面是一个输入和输出示例(我的原始数据集将有几十亿行):

输入数据集:

        state
0       Delaware
1       Delaware
2       Delaware
3       Indiana
4       Indiana
...     ...
1020    West Virginia
1021    West Virginia
1022    West Virginia
1023    West Virginia
1024    West Virginia

1025 rows × 1 columns
    state           Frequency   Percent Cumulative Frequency    Cumulative Percent
0   Vermont         246         24.00   246                     24.00
1   New Hampshire   237         23.12   483                     47.12
2   Missouri        115         11.22   598                     58.34
3   North Carolina  100         9.76    698                     68.10
4   Indiana         92          8.98    790                     77.07
5   Montana         56          5.46    846                     82.54
6   West Virginia   55          5.37    901                     87.90
7   North Dakota    53          5.17    954                     93.07
8   Washington      39          3.80    993                     96.88
9   Utah            29          2.83    1022                    99.71
10  Delaware        3           0.29    1025                    100.00
预期输出:

        state
0       Delaware
1       Delaware
2       Delaware
3       Indiana
4       Indiana
...     ...
1020    West Virginia
1021    West Virginia
1022    West Virginia
1023    West Virginia
1024    West Virginia

1025 rows × 1 columns
    state           Frequency   Percent Cumulative Frequency    Cumulative Percent
0   Vermont         246         24.00   246                     24.00
1   New Hampshire   237         23.12   483                     47.12
2   Missouri        115         11.22   598                     58.34
3   North Carolina  100         9.76    698                     68.10
4   Indiana         92          8.98    790                     77.07
5   Montana         56          5.46    846                     82.54
6   West Virginia   55          5.37    901                     87.90
7   North Dakota    53          5.17    954                     93.07
8   Washington      39          3.80    993                     96.88
9   Utah            29          2.83    1022                    99.71
10  Delaware        3           0.29    1025                    100.00

您可以先按状态分组以获取频率和百分比,然后在窗口上使用
sum
以获取累积频率和百分比:

result = df.groupBy('state').agg(
    F.count('state').alias('Frequency')
).selectExpr(
    '*',
    '100 * Frequency / sum(Frequency) over() Percent'
).selectExpr(
    '*',
    'sum(Frequency) over(order by Frequency desc) Cumulative_Frequency', 
    'sum(Percent) over(order by Frequency desc) Cumulative_Percent'
)

result.show()
+-------------+---------+-------+--------------------+------------------+
|        state|Frequency|Percent|Cumulative_Frequency|Cumulative_Percent|
+-------------+---------+-------+--------------------+------------------+
|West Virginia|        5|   50.0|                   5|              50.0|
|     Delaware|        3|   30.0|                   8|              80.0|
|      Indiana|        2|   20.0|                  10|             100.0|
+-------------+---------+-------+--------------------+------------------+

谢谢我也通过改变问题文本中共享的Pandas解决方案实现了同样的效果,替换了
datax=data['state'].value_counts()
datax=df.groupBy('state').count().sort(col(“count”).desc()).toPandas().set_index('state')['count']
,并从现在开始使用Pandas。我也得到了同样的结果,但我认为你的解决方案更好。您知道您的解决方案是否可以扩展并使用多个分区吗?考虑到我的数据将有数十亿行?关于我的文本问题,还有一个链接指向另一个(类似的)考虑到它的解决方案。您可以尝试:)我无法做出任何预测,许多因素可能会影响代码是否工作。是的,我收到一些警告:
WARN WindowExec:没有为窗口操作定义分区!将所有数据移动到单个分区,这可能会导致严重的性能下降。
找出设置分区的最佳方法…警告来自分组聚合后的部分。考虑到美国只有大约50个州,我不担心这一点。这只是一个用于这个问题的示例数据集@mck。我的真实记录有几十亿条:)我需要解决。