【问题标题】:pyspark crosstab with percentages带有百分比的pyspark交叉表
【发布时间】:2022-01-21 19:38:53
【问题描述】:

在 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


    【解决方案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。

    【讨论】:

    • 非常感谢您抽出宝贵时间。对于上面的示例数据,它工作正常,但是当我将它与真实数据一起应用时,它会抛出错误 ``` ParseException: mismatched input '+' Expecting {, '-'}(line 1, pos 17) == SQL == ```
    • @HAthedatascientist 如果您的数据与示例中的一样,这应该可以工作。很难在没有看到原始数据的情况下进行调试,但想法将保持不变
    • 列名中有一个错误,所以它抛出了一个错误。 col 名称不应包含任何空格或字符。谢谢!这对我帮助很大。
    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 2016-12-02
    • 2019-09-05
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    相关资源
    最近更新 更多