带有百分比的 pyspark 交叉表

pyspark crosstab with percentages

在 pyspark 中应用交叉表后,我有一个 DataFrame,示例如下

id A B C
cssdsd 0 1 0
sdsdsd 1 1 1
ssdssd 1 0 0
xxxxxx 0 0 0

我想获取行的百分比,而不是 0,1。 我可以使用交叉表函数

通过 pandas 轻松获得它
pd.crosstab(df.index,df.list, normalize='index')

我怎样才能在 pyspark 中得到这个?

得到交叉表结果后,在下面的代码中是df。获取除 id 以外的所有列的总和,然后将每列除以总和:

from pyspark.sql import functions as F

cols = [i for i in df.columns if not i=='id']
out = (df.withColumn("SumCols",F.expr('+'.join(cols)))
.select("id",*[F.coalesce(F.round(F.col(i)/F.col("SumCols"),2),F.lit(0)).alias(i) 
                                                                 for i in cols]))

out.show()

+------+----+----+----+
|    id|   A|   B|   C|
+------+----+----+----+
|cssdsd| 0.0| 1.0| 0.0|
|sdsdsd|0.33|0.33|0.33|
|ssdssd| 1.0| 0.0| 0.0|
|xxxxxx| 0.0| 0.0| 0.0|
+------+----+----+----+

请注意,如有必要,您可以在 select 语句循环中乘以 100。