首页 > 解决方案 > 在 Pyspark Dataframe 中聚合布尔值

问题描述

我正在尝试将表的某些列转换为行并聚合它们的值。我想要三列,代表布尔值(1、0、Null)。然后,单元格应表示这些值在原始数据框列中出现的次数。我正在使用 Python 和 Spark 2.4.0。

这是我的初始表:

+-----+-----+-----+-------+
|col_1|col_2|col_3|col_...|
+-----+-------------------+
|  0  |  1  |  0  |  ...  |
|  1  |  0  |  0  |  ...  |
| NaN |  0  |  0  |  ...  |
|  ...|  ...|  ...|  ...  |

我想要这样的东西:

+------+------+------+------+
|column| ones |zeroes| nans |
+------+--------------------+
| col_1|   1  |   1  |   1  |
| col_2|   1  |   2  |   0  |
| col_3|   0  |   3  |   0  |
|  ... |  ... |  ... |  ... |

输入和所需输出的列相同并且聚合值作为行的解决方案对我来说也很好。

标签: pythonapache-sparkpysparkapache-spark-sqltranspose

解决方案


是不是必须转位?
试试这个:

import pyspark.sql.functions as f
def counter(df, columnList):
  output = spark.createDataFrame([('0',), ('1',), ('NaN',)], ['valueCol'])
  for columnName in columnList:
    newDf = df.groupBy('%s'%(columnName)).count().select(f.col(columnName).alias('newCol'), f.col('count').alias('count_%s'%(columnName)))
    output = output.join(newDf, output.valueCol == newDf.newCol, 'outer').select(output['*'], newDf['count_%s'%(columnName)]).na.fill(0)
  return output

df = spark.createDataFrame([('1', '0', None), ('1', '1', '1'), ('1', None, '0'), ('0', '0', '0')], ['col1', 'col2', 'col3'])
df = df.na.fill('NaN')
display(counter(df, ['col1']))

推荐阅读