在 withColumn pyspark / python 中使用总和
Using sum in withColumn pyspark / python
我在一个小问题上需要你的帮助,我实际上是通过手动方式解决的,但我希望它“正确”
数据:
customer_id
gender
abc
m
def
w
等等
现在它通过以下方式获取聚合:
gender_count = data.groupBy('gender').agg(F.countDistinct('customer_id').alias('amount'))
gender_count:
gender
amount
m
4
w
6
现在,我想创建一个包含客户总数的新列,以计算各个性别的份额。
但是,我找不到适用于“withColumn”的函数。所以我做的是总结之前的客户数量,然后将其作为文字值插入:
gender_count = gender_count.withColumn('total', F.lit(10)).withColumn('share', (F.col('amount') / F.col('total')))
结果:
gender
amount
total
share
m
4
10
0.4
w
6
10
0.6
你知道我如何替换 F.lit(10) 吗?这将为我节省一个手动步骤和一个潜在的错误来源。
谢谢!
您可以在数据帧上使用 count()。
total_items = data.count()
gender_count = gender_count.withColumn('total', F.lit(total_items)).withColumn('share', (F.col('amount') / F.col('total')))
您可以在聚合之前将count
用作window函数以计算所有记录。
from pyspark.sql import functions as F
from pyspark.sql import Window as W
(df
.withColumn('count', F.count('*').over(W.partitionBy(F.lit(1))))
.groupBy('gender', 'count')
.agg(F.countDistinct('customer_id').alias('amount'))
.withColumn('share', F.col('amount') / F.col('count'))
.show()
)
+------+-----+------+-----+
|gender|count|amount|share|
+------+-----+------+-----+
| m| 10| 4| 0.4|
| w| 10| 6| 0.6|
+------+-----+------+-----+
我在一个小问题上需要你的帮助,我实际上是通过手动方式解决的,但我希望它“正确”
数据:
customer_id | gender |
---|---|
abc | m |
def | w |
等等
现在它通过以下方式获取聚合:
gender_count = data.groupBy('gender').agg(F.countDistinct('customer_id').alias('amount'))
gender_count:
gender | amount |
---|---|
m | 4 |
w | 6 |
现在,我想创建一个包含客户总数的新列,以计算各个性别的份额。 但是,我找不到适用于“withColumn”的函数。所以我做的是总结之前的客户数量,然后将其作为文字值插入:
gender_count = gender_count.withColumn('total', F.lit(10)).withColumn('share', (F.col('amount') / F.col('total')))
结果:
gender | amount | total | share |
---|---|---|---|
m | 4 | 10 | 0.4 |
w | 6 | 10 | 0.6 |
你知道我如何替换 F.lit(10) 吗?这将为我节省一个手动步骤和一个潜在的错误来源。
谢谢!
您可以在数据帧上使用 count()。
total_items = data.count()
gender_count = gender_count.withColumn('total', F.lit(total_items)).withColumn('share', (F.col('amount') / F.col('total')))
您可以在聚合之前将count
用作window函数以计算所有记录。
from pyspark.sql import functions as F
from pyspark.sql import Window as W
(df
.withColumn('count', F.count('*').over(W.partitionBy(F.lit(1))))
.groupBy('gender', 'count')
.agg(F.countDistinct('customer_id').alias('amount'))
.withColumn('share', F.col('amount') / F.col('count'))
.show()
)
+------+-----+------+-----+
|gender|count|amount|share|
+------+-----+------+-----+
| m| 10| 4| 0.4|
| w| 10| 6| 0.6|
+------+-----+------+-----+