带百分比的 pyspark 交叉表

问题描述 投票:0回答:2

在 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 中获取此内容?

python pandas pyspark data-analysis crosstab
2个回答
1
投票

获得交叉表结果后,即下面代码中的

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。


0
投票

df.crosstab(col1='索引', col2='列表').show()

© www.soinside.com 2019 - 2024. All rights reserved.