You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark中pandas_udf调用stats.norm.pdf触发AttributeError错误求助

解决pandas_udf中的AttributeError问题

错误的核心原因是:stats.norm.pdf接收pd.Series作为输入时,返回的是numpy.ndarray类型,而你的pandas_udf函数声明返回pd.Series,Spark在处理返回值时尝试对ndarray调用.array属性(内部逻辑),从而触发AttributeError。

你提到用np.sqrt没问题,是因为pandas对numpy的基础函数做了兼容包装——当给np.sqrt传入pd.Series时,它会返回pd.Series而非ndarray,所以能被Spark正确处理。

修正方法很简单,把stats.norm.pdf返回的ndarray转换成pd.Series即可:

from pyspark.sql import functions as F
import pyspark.sql.types as T
import pandas as pd
import numpy as np
from scipy import stats

df = sqlContext.createDataFrame( 
    [(25, 20, .25), 
    (20, 20, .22), 
    (35, 20, .67)], 
    ["control_mean", "control_sd", "pooled_se"]
)

def foo(control_mean: pd.Series, control_sd: pd.Series, pooled_se: pd.Series) -> pd.Series:
    
    mu_null = 0

    ##Calculate Likelihood of Null
    pdf = stats.norm.pdf(control_mean, mu_null, pooled_se)
    # 将numpy.ndarray转换为pd.Series
    return pd.Series(pdf)


foo_pudf = F.pandas_udf(foo, returnType=T.FloatType())

df.withColumn(
    "pdf", 
    foo_pudf(
        F.col("control_mean"), 
        F.col("control_sd"), 
        F.col("pooled_se")
    )
).show()

另外注意:你传入的control_sd参数在函数内未被使用,可考虑删除或调整逻辑避免冗余。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:01:22