首页 文章

将Pandas DataFrame的`numpy`操作转换为PySpark DataFrame的等效操作

提问于
浏览
1

我正在尝试将 numpy lambda函数转换为PySpark数据框的等效函数 . 我一直在努力寻找正确的功能/方法 .

我在Pandas数据帧上执行以下操作,为 panda_stack 生成一个新列 label

panda_stack['label'] = panda_stack.groupby('id')['prob1'].transform(lambda x: 0.0 if all(np.isnan(x)) else 1.0)

基本上,我有:

id   prob1
id1  NA
id1  0.12
id2  NA

并希望:

id  label
id1 1
id2 0

有人可以帮我翻译上面的代码到PySpark数据框的相同内容吗?

2 回答

  • 0

    您可以使用 collect_list 并应用相同的 numpy lambda 函数 .

    import pyspark.sql.functions as F
    from pyspark.sql.types import *
    
    check_udf = F.udf(lambda x: 0.0 if all(np.isnan(x)) else 1.0, FloatType())
    
    df = df.groupyby('id').agg(F.collect_list('prob1').alias('label'))\
           .select('id', check_udf(F.col('label').alias('label'))
    
  • 1

    我不能直截了当地回答 . 但在其他人回答之前,您可以使用以下代码

    import numpy as np
    import pyspark.sql.functions as F
    
    df = sqlContext.createDataFrame([(1, np.nan), (1, 0.12), (2, np.nan)], ('id', 'prob1'))
    
    df = df.withColumn(
        'prob1',
        F.when(
            F.col('prob1') == 0,
            F.lit(0.01)
        ).otherwise(
            F.col('prob1')
        )
    )
    
    df = df.fillna(0)
    
    df = df.groupBy('id').agg(
        F.sum(F.col('prob1')).alias('label')
    )
    
    df = df.withColumn(
        'label',
        F.when(
            F.col('label') != 0,
            F.lit(1)
        ).otherwise(
            F.col('label')
        )
    )
    
    df.show()
    

相关问题