python - 在 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 |
| ... | ... | ... | ... |
输入和所需输出的列相同并且聚合值作为行的解决方案对我来说也很好。
解决方案
是不是必须转位?
试试这个:
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']))
推荐阅读
- oauth-2.0 - ASP.NET Core 3.1 样板-Web Api 应用程序中用于 Office 365 的 OAuth 2.0 和 IMAP/SMTP
- firebase - 在 firebase 调整图像扩展时需要 2 倍和 3 倍图像缩放
- c# - 子Form设计器中的继承问题
- php - PHP中的正则表达式验证姓名和姓氏
- compilation - 如何使用 Clang 编译一个大而复杂的项目?
- android - AdMob RewardAd 内部类活动干扰
- ffmpeg - 在 shaka 打包器中记录 MPEG-DASH MPD 的 SegmentTimeline 时的算法
- python - Django Rest Framework 从相关表中获取数据
- haskell - 如何在 Daml 中调用具有动态名称的函数?
- azure - 在 Azure 门户中为事件类型 Microsoft.Storage.BlobCreated 创建主题筛选规则