带有百分比的 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。
在 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。