Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyspark-计算每个数据帧列中的空值数_Python_Python 3.x_Pyspark_Apache Spark Sql_Pyspark Sql - Fatal编程技术网

Python Pyspark-计算每个数据帧列中的空值数

Python Pyspark-计算每个数据帧列中的空值数,python,python-3.x,pyspark,apache-spark-sql,pyspark-sql,Python,Python 3.x,Pyspark,Apache Spark Sql,Pyspark Sql,我有一个包含许多列的数据框架。我的目标是生成一个dataframe,列出每个列名以及该列中的空值数量 例如: +-------------+-------------+ | Column_Name | NULL_Values | +-------------+-------------+ | Column_1 | 15 | | Column_2 | 56 | | Column_3 | 18 | | ... |

我有一个包含许多列的数据框架。我的目标是生成一个dataframe,列出每个列名以及该列中的空值数量

例如:

+-------------+-------------+
| Column_Name | NULL_Values |
+-------------+-------------+
|  Column_1   |      15     |
|  Column_2   |      56     |
|  Column_3   |      18     |
|     ...     |     ...     |
+-------------+-------------+
我已成功获得一列的空值数,如下所示:

df.agg(F.count(F.when(F.isnull(c), c)).alias('NULL_Count'))
其中c是数据帧中的一列。但是,它不显示列的名称。输出为:

+------------+
| NULL_Count |
+------------+
|     15     |
+------------+

有什么想法吗?

您可以使用列表理解来循环agg中的所有列,并使用别名重命名输出列:

导入pyspark.sql.F函数 df_agg=df.agg*[F.countF.whenF.isnullc,c.aliasc代表df.columns中的c] 但是,这将返回一行结果,如下所示:

df_agg.show +----+----+----+ |第1列|第2列|第3列| +----+----+----+ | 15| 56| 18| +----+----+----+ 如果您希望将结果放在一列中,则可以使用functools.reduce将df_agg中的每一列合并,如下所示:

从functools导入reduce df_agg_col=减少 lambda,b:a.b, df_agg.selectF.litc.aliasColumn_Name,F.colc.aliasNULL_Count 对于df_agg.列中的c df_agg_col.show +------+-----+ |列|名称|空|计数| +------+-----+ |第1列第15列| |第2列| 56| |第3列第18列| +------+-----+ 或者您可以跳过创建df_agg的中间步骤并执行以下操作:

df_agg_col=减少 lambda,b:a.b, df.agg F.countF.whenF.isnullc,c.alias'NULL\u Count' .选择f.litc.alias列名称,空\u计数 对于df列中的c
Scala的替代方案可能是

case class Test(id:Int, weight:Option[Int], age:Int, gender: Option[String])

val df1 = Seq(Test(1, Some(100), 23, Some("Male")), Test(2, None, 25, None), Test(3, None, 33, Some("Female"))).toDF()

df1.show()

+---+------+---+------+
| id|weight|age|gender|
+---+------+---+------+
|  1|   100| 23|  Male|
|  2|  null| 25|  null|
|  3|  null| 33|Female|
+---+------+---+------+

val s = df1.columns.map(c => sum(col(c).isNull.cast("integer")).alias(c))

val df2 = df1.agg(s.head, s.tail:_*)

val t = df2.columns.map(c => df2.select(lit(c).alias("col_name"), col(c).alias("null_count")))

val df_agg_col = t.reduce((df1, df2) => df1.union(df2))

df_agg_col.show()

非常好用,谢谢!你能解释一下星号在你的第一个聚合函数中的作用吗?@LEJ the*代表。此语法解压列表的内容,以便将其作为参数传递给函数。