计算 PySpark 中列中的非空值
2018-02-05
30878
我有一个包含空值的数据框:
from pyspark.sql import functions as F
df = spark.createDataFrame(
[(125, '2012-10-10', 'tv'),
(20, '2012-10-10', 'phone'),
(40, '2012-10-10', 'tv'),
(None, '2012-10-10', 'tv')],
["Sales", "date", "product"]
)
我需要计算“销售额”列中的非空值。
我尝试了 3 种方法。
第一个我做对了:
df.where(F.col("sales").isNotNull()).groupBy('product')\
.agg((F.count(F.col("Sales")).alias("sales_count"))).show()
# product | sales_count
# phone | 1
# tv | 2
第二个,它不正确:
df.groupBy('product')\
.agg((F.count(F.col("Sales").isNotNull()).alias("sales_count"))).show()
# product | sales_count
# phone | 1
# tv | 3
第三个,我得到了错误:
df.groupBy('product')\
.agg((F.col("Sales").isNotNull().count()).alias("sales_count")).show()
TypeError: 'Column' object is not callable
什么可能导致第二种和第三种方法中的错误?
3个回答
您第一次尝试在进行聚合之前过滤掉
Sales
列中带有
null
的行。因此,它给出了正确的结果。
但对于第二个代码
df.groupBy('product') \
.agg((F.count(F.col("Sales").isNotNull()).alias("sales_count"))).show()
您尚未对整个数据集进行
过滤
和
聚合
。如果您仔细分析,
F.col("Sales").isNotNull()
将为您提供
boolean
列,即
true
和
false
。因此
F.count(F.col("Sales").isNotNull())
仅计算分组数据集中的
boolean
值,如果您创建如下所示的新列,这一点就很明显了
。
df.withColumn("isNotNull", F.col("Sales").isNotNull()).show()
这将为您提供
+-----+----------+-------+---------+
|Sales| date|product|isNotNull|
+-----+----------+-------+---------+
| 125|2012-10-10| tv| true|
| 20|2012-10-10| phone| true|
| 40|2012-10-10| tv| true|
| null|2012-10-10| tv| false|
+-----+----------+-------+---------+
因此,第二次尝试的计数是正确的。
对于第三次尝试,
.count()
是一种不能用于聚合转换的操作。
只有返回
Column
数据类型的函数才能在
.agg()
中使用,它们可以是内置函数、UDF 或您自己的函数。
Ramesh Maharjan
2018-02-06
有一个更简单的方法:
>>> df.groupBy("product").agg({"Sales":"count"}).show()
+-------+------------+
|product|count(Sales)|
+-------+------------+
| phone| 1|
| tv| 2|
+-------+------------+
MaxU - stand with Ukraine
2018-02-05
计算非空值
-
仅适用于每个 字符串和数字 列:
df.summary("count").show() # +-------+-----+----+-------+ # |summary|Sales|date|product| # +-------+-----+----+-------+ # | count| 3| 4| 4| # +-------+-----+----+-------+
-
适用于任何类型的每个列:
df.agg(*[F.count(c).alias(c) for c in df.columns]).show() # +-----+----+-------+ # |Sales|date|product| # +-----+----+-------+ # | 3| 4| 4| # +-----+----+-------+
ZygD
2022-10-05