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

PCA函数返回DataFrame异常:传入df_2_centered触发NameError

问题修复方案

问题原因

核心问题是判断条件str(1) in str(inputFileName)完全不可靠:

  • 你传入的是DataFrame对象而非文件名字符串,将DataFrame转为字符串后会包含数据内容(比如df_2_centered里的-1.769231包含字符"1"),导致传入df_2_centered时也会进入if分支,else分支从未执行,全局变量df_2_withPCA根本未被定义,因此触发NameError。
  • 依赖全局变量本身属于不良编程习惯,会大幅增加调试难度和意外bug的概率。

修改方案

方案1:移除全局变量,直接返回结果(推荐)

完全去掉全局变量,函数处理后直接返回DataFrame,调用时自行接收结果即可,逻辑更清晰:

def performPCA(input_df):
    pca = PCA()
    pca.fit(input_df)     
    pca_scores = pca.transform(input_df)
    
    df_withPCA = pd.DataFrame(pca_scores)
    # 添加列名
    df_withPCA = df_withPCA.set_axis(['X_coordinate', 'Y_coordinate', 'Z_coordinate'], axis=1)
    # 保留两位小数
    df_withPCA = df_withPCA.round(2)
    
    return df_withPCA

# 调用示例
df_1_withPCA = performPCA(df_1_centered)
df_2_withPCA = performPCA(df_2_centered)

方案2:添加类型参数区分输入(需保留原有变量名逻辑时用)

如果一定要在函数内赋值全局变量,可以添加额外参数明确区分输入类型,彻底避免不可靠的字符串判断:

def performPCA(input_df, df_num):
    global df_1_withPCA, df_2_withPCA
    
    pca = PCA()
    pca.fit(input_df)     
    pca_scores = pca.transform(input_df)
    
    df_withPCA = pd.DataFrame(pca_scores)
    df_withPCA = df_withPCA.set_axis(['X_coordinate', 'Y_coordinate', 'Z_coordinate'], axis=1)
    df_withPCA = df_withPCA.round(2)
    
    if df_num == 1:
        df_1_withPCA = df_withPCA
        return df_1_withPCA
    else:
        df_2_withPCA = df_withPCA
        return df_2_withPCA

# 调用示例
performPCA(df_1_centered, 1)
performPCA(df_2_centered, 2)

关键提醒

  • 永远不要通过将对象转为字符串的方式判断其身份,这种方式极易因数据内容的巧合导致逻辑错误。
  • 尽量避免使用全局变量,函数的输入输出应保持清晰独立,降低代码耦合度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:15:42