在 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。
df.crosstab(col1='索引', col2='列表').show()