Skip to main content
 首页 » 编程设计

python之如何计算数据框的百分比

2025年05月04日9soundcode

我有一个模拟数据框的场景,如下所示。

Area   Type    NrPeople      
1      House    200 
1      Flat     100 
2      House    300 
2      Flat     400 
3      House   1000 
4      Flat     250 

如何按降序计算并返回每个区域的人数,但最重要的是我很难计算总体百分比。

结果应该是这样的:

Area   SumPeople      %      
3       1000        44% 
2        700        31% 
1        300        13% 
4        250        11% 

请参阅下面的代码示例:

HouseDf = spark.createDataFrame([("1", "House", "200"),  
                              ("1", "Flat", "100"),  
                              ("2", "House", "300"),  
                              ("2", "Flat", "400"), 
                              ("3", "House", "1000"),  
                              ("4", "Flat", "250")], 
                              ["Area", "Type", "NrPeople"]) 
 
import pyspark.sql.functions as fn  
Total = HouseDf.agg(fn.sum('NrPeople').alias('Total'))  
 
Top = HouseDf\ 
    .groupBy('Area')\ 
    .agg(fn.sum('NrPeople').alias('SumPeople'))\ 
    .orderBy('SumPeople', ascending=False)\ 
    .withColumn('%', fn.lit(HouseDf.agg(fn.sum('NrPeople'))/Total.Total))\ 
Top.show() 

这失败了:不支持的操作数类型/: 'int' 和 'DataFrame'

任何想法欢迎如何做到这一点!

请您参考如下方法:

你需要窗口函数-

import pyspark.sql.functions as fn  
from pyspark.sql.functions import rank,sum,col 
from pyspark.sql import Window 
 
window = Window.rowsBetween(Window.unboundedPreceding,Window.unboundedFollowing) 
 
HouseDf\ 
.groupBy('Area')\ 
.agg(fn.sum('NrPeople').alias('SumPeople'))\ 
.orderBy('SumPeople', ascending=False)\ 
.withColumn('total',sum(col('SumPeople')).over(window))\ 
.withColumn('Percent',col('SumPeople')*100/col('total'))\ 
.drop(col('total')).show() 

输出:

+----+---------+------------------+ 
|Area|SumPeople|           Percent| 
+----+---------+------------------+ 
|   3|   1000.0| 44.44444444444444| 
|   2|    700.0| 31.11111111111111| 
|   1|    300.0|13.333333333333334| 
|   4|    250.0| 11.11111111111111| 
+----+---------+------------------+