PySpark:在多个列中计算非零键

时间:2018-08-29 05:39:37

标签: apache-spark group-by pyspark

此帖子的后续内容: Counting non zero values in each column of a dataframe in python

目标是分别为每个“ Tag_0”和“ Tag_1”列计算有助于至少一个非零条目的“ Id”唯一值的数量。

基本输入

df

Id, Tag_0, Tag_1
Sam, 0, 5
Sam, 1, 3
Ron, 3, 1
Bob, 0, 3
Bob, 0, 4
Bob, 0, 0

所需的输出

Feature, NumUniqIdsPositive
Tag_0, 2
Tag_1, 3

此结果可以通过在列上使用循环标准实现,对于每个列C,我们可以调用

count = df.filter(df[C] > 0).select("Id").distinct().count()

但是,这样的循环效率很低,尤其是当列数大于1k时(例如,上面的示例包含Tag_0,Tag_1,...,Tag_1000)

我尝试了上面链接中的一些解决方案,但无法在groupBy子句中使用(column != 0).sum()

重复的问题?

不确定该查询是否可能重复,但为了澄清一下:我们正在寻找以下形式的解决方案

Tag_cols = [f for f in df.columns if "Tag" in f]
dg = df.groupBy(Tag_cols, (F.when(df[f] >0, True) for f in Tag_cols)).\
    agg(countDistinct("Id"))

由于在when语句中如何循环ftr_cols,因此此尝试不起作用。如果有人可以解释为什么这可能是重复的话,那么我很烦。

0 个答案:

没有答案